2008-10-08 21 views
24

que estoy tratando de conseguir este sencillo script de PowerShell de trabajo, pero creo que algo está fundamentalmente mal ;-)Ejecutar un programa en un foreach

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

Básicamente quiero obtener los archivos en un directorio y pasar una por uno como argumentos a la herramienta personalizada.

Respuesta

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

A medida que cada objeto desciende por la tubería, la herramienta se ejecutará en su contra. Poner comillas alrededor de la cadena de comando hace que sea ... ¡una picadura! La variable local "$ _" probablemente no sepa qué hacer, por lo que vomita con un error.

6

Apuesto a que su herramienta necesita la ruta completa. $ _ Es cada objeto de archivo que viene a través de la canalización. Es probable que necesite utilizar una expresión como la siguiente:

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

Si aún necesita comillas alrededor de la ruta de comandos (por ejemplo, si tiene espacios), sólo lo hacen de esta manera:

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

Observe el uso de & antes de la cadena para forzar a PowerShell a interpretarlo como un comando y no como una cadena.

+0

Y si se necesitan banderas, que pueden ser añadidos después del final; 'ls | % {& "C: \ Working \ tools \ custom-tool.exe" $ _. FullName --flag --flag2 = 47} ' –

+0

¿Qué hace el%? – User

+0

Me enteré. Es un alias para 'ForEach-Object'. Puede ver los alias actuales en el indicador de PowerShell escribiendo 'get-alias' – User

2

Tanto Jeffrery Hicks como slipsec son correctos. Deshazte de las comillas dobles.

$ _ o $ _. Fullname funcionó en mi script de prueba (abajo). YMMV con su herramienta personalizada.

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

o

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