2009-12-16 8 views
11

Estoy intentando ejecutar un comando de PowerShell para llamar 7-Zip para cerrar la cremallera de una carpeta con el siguiente comando:Invoke-expresión con exe en Archivos de programa

$command = $SevenZip + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName 
Invoke-Expression $command 

Las variables que se alimenta en comando $ son ya está configurado y $ SevenZip es "c: \ Archivos de programa \ 7-Zip \ 7z.exe"

Esto no está funcionando y estoy tratando de encontrar la mejor manera de llamar a 7-Zip de Powershell. Ideas?

Respuesta

21

que he tenido el mismo problema antes. Este es el código (casi) directamente desde un script de copia de seguridad que uso actualmente:

[string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe"; 
[Array]$arguments = "a", "-tgzip", $outputFilePath, $inputFilePath; 

& $pathToZipExe $arguments; 

me he metido en el hábito de usar una matriz de argumentos con el operador de llamada, Parece que es más robusto que otros métodos.

+0

Gracias! Perfecto. – onupdatecascade

+0

¿Alguna forma de obtener el código de retorno de exe? – Robin

3

Realmente no necesita invocación-expresión. Simplemente puede invocar el comando utilizando el símbolo de unión, tales como:

&$Command 

Pero también hay el cmdlet Start-proceso que podría ser más adecuado para lo que estamos tratando de hacer. Al ejecutar el comando como una cadena arriba, es propenso a errores si el $ SevenZip contiene espacios y no está citado. En cambio, usaría:

Start-Process $SevenZip "...rest..." 
1

Déjame adivinar, está intentando invocar "c: \ Program"?

No estoy seguro de la sintaxis correcta para PS, pero tendrá que hacer algo al respecto.

+1

correcta - eso es exactamente lo que está tratando de hacer ... – Guy

6

No necesita usar Invoke-Expression solo use el operador de invocación (llamada) & para invocar una cadena que nombra un comando para ejecutar. Tenga en cuenta que usted quiere mantener los parámetros se separan en este caso, es decir, la cadena SevenZip debe ser la ruta de acceso al archivo EXE ej .:

&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName 
0

Obras para mí:

$command = "& ""$SevenZip""" + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName 

Write-Host "Running: $command" 

Invoke-Expression $command 
2

me encontré con este problema también, aquí fue mi solución.

invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log " 

yo era capaz de dejar a mis Paramaters fuera de las comillas simples apuntando a mi exe, creo que esta es probablemente la forma más fácil de llamar a un exe con los parámetros utilizando la invocación de expresión.

+0

buena solución que funcionó para mí – lara400

0

También puede usar comandos de MS-DOS desde un script de Windows PowerShell.

Siempre me ha encantado el comando START de CMD.exe, que le permite iniciar un comando en paralelo.

Así que para empezar el 7-zip, poner el siguiente comando en el script de PowerShell:

cmd.exe /c start <your 7-zip command like in MS-DOS> 
+0

esta respuesta no ayuda de ninguna manera a resolver el problema –

Cuestiones relacionadas