Invoke-Expression avec exe dans Program Files
-
20-09-2019 - |
Question
Je suis en train d'exécuter une commande Powershell pour appeler 7-Zip zip un dossier en utilisant la commande suivante:
$command = $SevenZip + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName
Invoke-Expression $command
Les variables sont introduites dans la commande $ sont déjà définis et SevenZip $ est "c: \ Program Files \ 7-Zip \ 7z.exe"
Ce ne fonctionne pas et je suis en train de travailler la meilleure façon d'appeler 7-Zip de Powershell. Idées?
La solution
J'ai eu le même problème auparavant. Ceci est du code (presque) directement à partir d'un script de sauvegarde que j'utilise actuellement:
[string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe";
[Array]$arguments = "a", "-tgzip", $outputFilePath, $inputFilePath;
& $pathToZipExe $arguments;
J'ai pris l'habitude d'utiliser un tableau d'arguments avec l'opérateur d'appel, il semble être plus robuste que d'autres méthodes.
Autres conseils
Vous n'avez pas besoin d'utiliser Invoke-Expression il suffit d'utiliser l'opérateur d'appel (appel) &
pour appeler une chaîne qui nomme une commande à exécuter. Notez que vous souhaitez conserver les paramètres séparés dans ce cas, à savoir la chaîne SevenZip doit juste être le chemin vers le fichier EXE par exemple:.
&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName
Vous ne fait pas besoin Invoke-Expression. Vous pouvez simplement appeler la commande en utilisant l'esperluette tels que:
&$Command
Mais il y a aussi la cmdlet Start-Process qui pourrait être mieux pour ce que vous essayez de faire. En exécutant la commande en tant que chaîne ci-dessus, vous êtes sujette à des erreurs si le SevenZip $ contient des espaces et ne sont pas cotés. Au lieu de cela, j'utiliser:
Start-Process $SevenZip "...rest..."
Je suis tombé sur ce problème aussi bien, voici ma solution était.
invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log "
J'ai pu quitter mes paramaters en dehors des guillemets simples pointant vers mon exe, je pense que ce qui est probablement la meilleure façon d'appeler un exe avec des paramètres à l'aide invoquer l'expression.
Laisse-moi deviner, il essaie d'invoquer "c: \ Program"?
Pas sûr de la syntaxe correcte pour le PS, mais vous aurez besoin de faire quelque chose de cet espace.
Travaux pour moi:
$command = "& ""$SevenZip""" + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName
Write-Host "Running: $command"
Invoke-Expression $command
Vous pouvez également utiliser les commandes MS-DOS à partir d'un script Windows PowerShell.
Je l'ai toujours aimé la commande START cmd.exe, qui vous permet de lancer une commande en parallèle.
Donc, pour commencer votre 7-zip, mettez la commande suivante dans votre script Powershell:
cmd.exe /c start <your 7-zip command like in MS-DOS>