Вызывать-Выражение с помощью exe в Program Files
-
20-09-2019 - |
Вопрос
Я пытаюсь запустить команду Powershell для вызова 7-Zip, чтобы заархивировать папку, используя следующую команду:
$command = $SevenZip + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName
Invoke-Expression $command
Переменные, вводимые в $command, уже установлены, а $ SevenZip равен "c:\Program Files\7-Zip\7z.exe"
Это не работает, и я пытаюсь найти наилучший способ вызвать 7-Zip из Powershell.Идеи?
Решение
У меня уже была такая же проблема раньше.Это код (почти) прямо из сценария резервного копирования, который я использую в настоящее время:
[string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe";
[Array]$arguments = "a", "-tgzip", $outputFilePath, $inputFilePath;
& $pathToZipExe $arguments;
У меня вошло в привычку использовать массив аргументов с оператором call, он кажется более надежным, чем другие методы.
Другие советы
Вам не нужно использовать Invoke-Expression, просто используйте оператор вызова (call) &
чтобы вызвать строку, которая называет команду для выполнения.Обратите внимание, что в этом случае вы хотите сохранить параметры раздельными, т. е.строка SevenZip должна быть просто путем к исполняемому файлу, например:
&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName
На самом деле вам не нужно Invoke-Expression .Вы можете просто вызвать команду, используя амперсанд, такой как:
&$Command
Но есть также командлет Start-Process, который, возможно, лучше подходит для того, что вы пытаетесь сделать.Выполняя команду в виде строки выше, вы подвержены ошибкам, если $SevenZip содержит пробелы и не заключен в кавычки.Вместо этого я бы использовал:
Start-Process $SevenZip "...rest..."
Я тоже столкнулся с этой проблемой, вот мое решение.
invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log "
я смог оставить свои параметры вне одинарных кавычек, указывающих на мой exe, я думаю, что это, вероятно, самый простой способ вызвать exe с параметрами, используя invoke-expression .
Дай угадаю, он пытается вызвать "c:\Program"?
Не уверен в правильном синтаксисе для PS, но вам нужно будет что-то сделать с этим пространством.
Работает на меня:
$command = "& ""$SevenZip""" + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName
Write-Host "Running: $command"
Invoke-Expression $command
Вы также можете использовать команды MS-DOS из скрипта Windows PowerShell.
Мне всегда нравилась команда START CMD.exe, которая позволяет запускать команды параллельно.
Итак, чтобы запустить ваш 7-zip, введите следующую команду в свой сценарий Powershell:
cmd.exe /c start <your 7-zip command like in MS-DOS>