Pregunta

Estoy intentando ejecutar un comando de PowerShell para llamar 7-Zip para cerrar la cremallera de una carpeta con el siguiente comando:

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

Las variables que se introducen en orden $ ya están definidos y $ SevenZip es "C: \ Archivos de programa \ 7-Zip \ 7z.exe"

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

¿Fue útil?

Solución

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.

Otros consejos

No es necesario utilizar Invoke-expresión sólo tiene que utilizar la invocación & (llamada) del operador para invocar una cadena que da nombre a un comando a 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 por ejemplo:.

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

En realidad no es necesario Invoke-expresión. Simplemente puede invocar el comando utilizando el símbolo de unión, tales como:

&$Command

Pero también existe el cmdlet Start-proceso que podría ser más adecuado para lo que estamos tratando de hacer. Mediante la ejecución de la orden como una cadena arriba, usted es propenso a errores si los $ SevenZip contiene espacios y no se cita. En su lugar me gustaría utilizar:

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

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 esto es probablemente la forma más fácil de llamar a un exe con los parámetros utilizando la invocación de expresión.

Déjame adivinar, que está tratando de invocar "c: \ Program"?

No está seguro de la sintaxis correcta de PS, pero tendrá que hacer algo con ese espacio.

A mí me funciona:

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

Write-Host "Running: $command"

Invoke-Expression $command

También puede utilizar los comandos de MS-DOS desde dentro de un script de Windows PowerShell.

Siempre me ha gustado comando START de CMD.exe, lo 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> 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top