Frage

Ich möchte den Inhalt einer Datei, Filter abzurufen und sie zu verändern und das Ergebnis zurück in eine Datei zu schreiben. Ich tue dies:

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 enthält

"abc -" + $_                                                                                                           
------------                                                                                                           
abc -test1                                                                                                             
abc -test2             

Was gibt mit dieser ersten Zeile? Es ist fast wie foreach ein IEnumerable gibt zurück - aber $ newTestContents.GetType () zeigt es eine Aufgabe Array ist. Also, was soll das? Wie kann ich die Array Ausgang normalerweise ohne den seltsamen Kopf erhalten.

Auch Bonuspunkte, wenn Sie mir sagen, warum $ newTestContents [0] .ToString () eine leere Zeichenfolge

War es hilfreich?

Lösung

Verwenden FürJeden anstelle des Select-Object

Andere Tipps

  
    

Auch Bonuspunkte, wenn Sie mir sagen, warum $ newTestContents [0] .ToString () eine leere Zeichenfolge

  

Wenn Sie an der Art sehen, es ist ein PSCustomObject z.

PS> $newTestContents[0].GetType().FullName
System.Management.Automation.PSCustomObject

Wenn man sich PSCustomObject ToString () impl in Reflector Sie sehen:

public override string ToString()
{
    return "";
}

Warum es das tut, weiß ich nicht. Es ist jedoch wahrscheinlich besser, String-Typ Zwang in Powershell z zu benutzen.

PS> [string]$newTestContents[0]
@{"abc -" + $_=abc -test1}

Vielleicht suchen Sie für dieses Ergebnis aber:

PS> $newTestContents | %{$_.{"abc -" + $_}}
abc -test1
abc -test2

Dies zeigt, dass, wenn Sie Select-Object mit einem einfachen Skript des Inhalt dieser Skript zur Verwendung auf dem PSCustomObject die neuen Eigenschaftsnamen bilden, die erstellt wird. Im Allgemeinen ist Nestor Ansatz der Weg zu gehen, aber in der Zukunft, wenn Sie so Eigenschaften synthensize benötigen dann eine Hash-Tabelle verwenden, etwa so:

PS> $newTestContents = $testContents | Select @{n='MyName';e={"abc -" + $_}}
PS> $newTestContents

MyName
------
abc -test1
abc -test2


PS> $newTestContents[0].MyName
abc -test1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top