Buscar

05 - Usando ScriptBlocks com o SelectObject - Transcrição

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Continue navegando