Invoke-Expression с exe в программных файлах

Я пытаюсь запустить команду 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. Идеи?


person Guy    schedule 16.12.2009    source источник


Ответы (7)


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

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

& $pathToZipExe $arguments;

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

person Tom Hazel    schedule 18.12.2009

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

&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName
person Keith Hill    schedule 16.12.2009

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

&$Command

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

Start-Process $SevenZip "...rest..."
person Josh    schedule 16.12.2009

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

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.

person Craig Strohl    schedule 13.01.2015

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

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

person Anon.    schedule 16.12.2009

Работает на меня:

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

Write-Host "Running: $command"

Invoke-Expression $command
person Ivan    schedule 03.02.2014

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

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

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

    cmd.exe /c start <your 7-zip command like in MS-DOS> 
person Josh K    schedule 25.05.2015
comment
этот ответ никоим образом не помогает решить проблему - person Andi Pavllo; 25.05.2015