在Program Files中使用exe文件的Invoke-Expression

13

我正在尝试运行一个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"。

这不起作用,我正在尝试找出从Powershell调用7-Zip的最佳方法。有什么建议吗?

7个回答

25

我之前也遇到过同样的问题。以下是我目前使用的备份脚本(几乎)原封不动的代码:

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

& $pathToZipExe $arguments;

我已经养成了使用调用运算符的参数数组的习惯,这种方法似乎比其他方法更加健壮可靠。


7

您无需使用Invoke-Expression,只需使用调用运算符&来调用命名要执行的命令的字符串。请注意,在这种情况下,您需要将参数分开,即字符串SevenZip应该只是EXE的路径,例如:

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

4
您实际上不需要使用Invoke-Expression。您可以通过使用&符号来调用命令,例如:
&$Command

但是,Start-Process命令可能更适合您要执行的操作。通过以上将命令作为字符串执行,如果$SevenZip包含空格并且没有引号,则容易出现错误。相反,我建议使用以下方式:

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

4

我也遇到了这个问题,以下是我的解决方案。

invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log "

我能够在单引号之外留下指向我的exe的参数,我认为这可能是使用invoke-expression调用带有参数的exe的最简单的方法。


1

让我猜猜,它试图调用 "c:\Program"?

不确定 PS 的正确语法,但你需要处理一下那个空格。


0

对我来说可行:

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

Write-Host "Running: $command"

Invoke-Expression $command

0

你也可以在Windows PowerShell脚本中使用MS-DOS命令。

我一直很喜欢CMD.exe的START命令,它允许你并行启动一个命令。

因此,要启动你的7-zip,请在你的Powershell脚本中输入以下命令:

    cmd.exe /c start <your 7-zip command like in MS-DOS> 

这个答案对解决问题没有任何帮助。 - Andi Pavllo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接