Powershell: Ausgangsobjekt [] in eine Datei
-
06-07-2019 - |
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
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