Invoke-Expression с exe в программных файлах - PullRequest
11 голосов
/ 16 декабря 2009

Я пытаюсь запустить команду Powershell для вызова 7-Zip, чтобы сжать папку, используя следующую команду:

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

Переменные, вводимые в команду $, уже установлены, и $ SevenZip имеет значение «c: \ Program Files \ 7-Zip \ 7z.exe»

Это не работает, и я пытаюсь найти лучший способ вызвать 7-Zip из Powershell. Идеи? * * 1006

Ответы [ 7 ]

23 голосов
/ 19 декабря 2009

У меня была такая же проблема раньше. Это код (почти) прямо из скрипта резервного копирования, который я сейчас использую:

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

& $pathToZipExe $arguments;

Я привык использовать массив аргументов с оператором вызова. Кажется, он более устойчив, чем другие методы.

6 голосов
/ 16 декабря 2009

Вам не нужно использовать Invoke-Expression, просто используйте оператор вызова (call) &, чтобы вызвать строку с именем команды для выполнения. Обратите внимание, что вы хотите сохранить параметры отдельно в этом случае, то есть строка SevenZip должна быть просто путем к EXE, например ::100100

&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName
4 голосов
/ 16 декабря 2009

На самом деле вам не нужно выражение-выражение. Вы можете просто вызвать команду, используя амперсанд, такой как:

&$Command

Но есть и командлет Start-Process, который лучше подходит для того, что вы пытаетесь сделать. Выполнив команду в виде строки выше, вы подвержены ошибкам, если $ SevenZip содержит пробелы и не заключен в кавычки. Вместо этого я бы использовал:

Start-Process $SevenZip "...rest..."
2 голосов
/ 14 января 2015

Я тоже столкнулся с этой проблемой, вот мое решение.

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-выражение.

1 голос
/ 16 декабря 2009

Дай угадаю, он пытается вызвать "c: \ Program"?

Не уверен в правильном синтаксисе для PS, но вам нужно что-то сделать с этим пространством.

0 голосов
/ 25 мая 2015

Вы также можете использовать команды MS-DOS из скрипта Windows PowerShell.

Мне всегда нравилась команда START CMD.exe, которая позволяет вам запускать команду параллельно.

Итак, чтобы запустить 7-zip, введите следующую команду в ваш скрипт Powershell:

    cmd.exe /c start <your 7-zip command like in MS-DOS> 
0 голосов
/ 03 февраля 2014

у меня работает:

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

Write-Host "Running: $command"

Invoke-Expression $command
...