Baixe o app para aproveitar ainda mais
Prévia do material em texto
05 Usando ScriptBlocks com o SelectObject Hora de aplicar o que vimos anteriormente para a formatação da saída dos nossos scripts em migração! gci -Recurse -File | Where-Object Name -like "*_migrando_*" | Select-Object Name, Length Quando selecionamos os arquivos, pegamos o Name e o Length. Mas agora, queremos dividir o Length por 1KB, usando as conversões de bytes do PowerShell. gci -Recurse -File | Where-Object Name -like "*_migrando_*" | Select-Object Name, Length / 1KB Copiaremos esse código, e colaremos no PowerShell. Após o "Enter", encontramos um erro: PS C:\Scripts> gci -Recurse -File | Where-Object Name -like "*_migrando_*" | Select-Object Name, Length / 1KB Select-Object : Não é possível localizar um parâmetro posicional que aceite o argumento `/`. O PowerShell não entendeu que queremos pegar a propriedade Length e dividir por 1KB. O que escrevemos foi basicamente dividir um "nome" por um "número", o que não faz muito sentido, não é mesmo? Vamos dar uma olhada na sintaxe do Select-Object? No PowerShell, digitamos get-help Select-Object. E então obtemos o seguinte: SINTAXE Select-Object [[-Property] <Object[]> [-ExcludeProperty <String[]>] [-ExpandProperty <String>] [-First <Int32>] [-InputObject <PSObject>] [-Last <Int32>] [-Skip <Int32>] [-Unique] [-Wait] [<CommonParameters>] Select-Object [[-Property] <Object[]> [-ExcludeProperty <String[]>] [-ExpandProperty <String>] [-InputObject <PSObject>] [-SkipLast <Int32>] [-Unique] [<CommonParameters>] Select-Object [-Index <Int32[]> [-InputObject <PSObject>] [-Last <Int32>] [-Unique] [-Wait] [<CommonParameters>] [<CommonParameters>] Ou seja, não ficamos presos a utilizar somente strings. Se queremos realizar a execução de uma expressão, é necessário utilizar um objeto especial, o Script Block {}. Dizemos para o PowerShell que um código será executado a cada item com o { }. Para acessar a propriedade Length, é necessário usar a variável de iteração: $_. A partir dessa variável, podemos acessar a propriedade Length: gci -Recurse -File | Where-Object Name -like "*_migrando_*" | Select-Object Name, { $_.Length / 1KB } Agora o Select-Object recebe uma string com o conteúdo de Name, e ele também recebe um outro objeto, que é o Script Block. Vamos copiar esse comando e colar no PowerShell. PS C:\Scripts> gci -Recurse -File | Where-Object Name -like "*_migrando_*" | Select-Object Name, { $_.Length / 1KB } Podemos ver que essa divisão foi feita, mas não da maneira que estávamos esperando. Então, no PowerShell, vamos utilizar conhecimentos adquiridos anteriormente, o Format Specifier com o operador format para strings. Depois de construído, podemos colar no PowerShell. PS C:\Scripts> gci -Recurse -File | Where-Object Name -like "*_migrando_*" | Select-Object Name, { "{0:N2}KB" -f $_.Length / 1KB } Observe que a propriedade Length não foi retornada e o código deixou de funcionar! Isso acontece porque, quando utilizamos o -f, será retornado uma string formatada, e aqui no caso, estamos passando somente um argumento Length do arquivo. Depois, tentamos dividir uma string (que é o resultado da expressão "{0:N2}KB" -f $_.Length) por 1KB, o que não faz sentido. Quando o PowerShell encontra um erro no Select, ele simplesmente deixa a coluna em branco. Para resolver esse problema, colocaremos uma parte da expressão entre ( ), e então aplicar o formato na expressão retornada pela divisão do tamanho por 1KB. PS C:\Scripts> gci -Recurse -File | Where-Object Name -like "*_migrando_*" | Select-Object Name, { "{0:N2}KB" -f ($_.Length / 1KB) } Como você pode ver, agora o tamanho está formatado corretamente. 05 Usando ScriptBlocks com o SelectObject
Compartilhar