objeto de saída [] para um arquivo: Powershell
-
06-07-2019 - |
Pergunta
Eu gostaria de recuperar o conteúdo de um arquivo, filtro e modificá-los e escrever a parte de trás resultado para um arquivo. Eu faço isso:
PS C:\code> "test1" >> test.txt
PS C:\code> "test2" >> test.txt
PS C:\code> $testContents = Get-Content test.txt
PS C:\code> $newTestContents = $testContents | Select-Object {"abc -" + $_}
PS C:\code> $newTestContents >> output.txt
output.txt contém
"abc -" + $_
------------
abc -test1
abc -test2
O que dá com essa primeira linha? É quase como foreach devolve um IEnumerable - mas $ newTestContents.GetType () revela que é uma matriz de objeto. Então, o que dá? Como posso obter a matriz de saída normalmente sem a estranha cabeçalho.
Também pontos de bônus se você pode me dizer por quê $ newTestContents [0] .ToString () é uma cadeia em branco
Solução
Use ForEach em vez da Select-Object
Outras dicas
Também pontos de bônus se você pode me dizer por quê $ newTestContents [0] .ToString () é uma cadeia em branco
Se você olhar para o seu tipo, é uma PSCustomObject por exemplo.
PS> $newTestContents[0].GetType().FullName
System.Management.Automation.PSCustomObject
Se você olhar para ToString do PSCustomObject () impl no refletor você vê o seguinte:
public override string ToString()
{
return "";
}
Por que ele faz isso, eu não sei. No entanto, é provavelmente melhor tipo string uso coerção no PowerShell por exemplo:.
PS> [string]$newTestContents[0]
@{"abc -" + $_=abc -test1}
Talvez você estava procurando este resultado entanto:
PS> $newTestContents | %{$_.{"abc -" + $_}}
abc -test1
abc -test2
Isso demonstra que quando você usar Select-Object com um scriptblock simples o conteúdo do que scriptblock formar o novo nome da propriedade na PSCustomObject que é criado. Em geral, a abordagem de Nestor é o caminho a percorrer, mas no futuro, se você precisa propriedades synthensize como este, em seguida, usar um hashtable assim:
PS> $newTestContents = $testContents | Select @{n='MyName';e={"abc -" + $_}}
PS> $newTestContents
MyName
------
abc -test1
abc -test2
PS> $newTestContents[0].MyName
abc -test1