2008-10-08 10 views
24

Ich versuche, diesen einfachen Powershell-Skript zum Laufen zu bringen, aber ich denke, etwas grundlegend falsch ;-)Führen Sie ein Programm in einem foreach

ls | foreach { "C:\Working\tools\custom-tool.exe" $_ } 

ist in einem Verzeichnis Ich mag im Grunde Dateien bekommen und ihnen eine übergeben um eins als Argumente für das benutzerdefinierte Tool.

Antwort

31
ls | %{C:\Working\tools\custom-tool.exe $_} 

Sobald jedes Objekt in die Pipeline kommt, wird das Werkzeug dagegen ausgeführt. Wenn man die Befehlsfolge in Anführungszeichen setzt, ist es ... ein Stich! Die lokale Variable "$ _" wird dann wahrscheinlich nicht wissen was zu tun ist also kotzt mit einem Fehler.

6

Ich wette, dass Ihr Werkzeug den vollständigen Pfad benötigt. Das $ _ ist jedes Dateiobjekt, das durch die Pipeline kommt. Sie müssen wahrscheinlich einen Ausdruck wie folgt verwenden:

ls | %{C:\Working\tools\custom-tool.exe $_.fullname} 
40

Wenn Sie noch Anführungszeichen um den Befehlspfad benötigen (zum Beispiel, wenn Sie Räume haben), tun Sie es einfach wie folgt aus:

ls | % { &"C:\Working\tools\custom-tool.exe" $_.FullName } 

Beachten Sie die Verwendung von & vor der Zeichenfolge, um PowerShell zu zwingen, sie als Befehl und nicht als Zeichenfolge zu interpretieren.

+0

Und wenn Fahnen benötigt werden, können sie nach dem Ende hinzugefügt werden; 'ls | % {& "C: \ Working \ Werkzeuge \ custom-tool.exe" $ _. FullName --flag --flag2 = 47} ' –

+0

Was macht%? – User

+0

Ich habe es herausgefunden. Es ist ein Alias ​​für 'ForEach-Object'. Sie können aktuelle Aliase an der Powershell-Eingabeaufforderung anzeigen, indem Sie "get-alias" eingeben – User

2

Sowohl Jeffrerry Hicks und slipsec sind korrekt. Yank die doppelten Anführungszeichen ab.

$ _ oder $ _. Fullname arbeitete in meinem Testskript (unten). YMMV mit Ihrem benutzerdefinierten Tool.

gci | % { c:\windows\notepad.exe $_.fullname } 

oder

gci | % { c:\windows\notepad.exe $_ } 
Verwandte Themen