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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top