在程序文件中使用 exe 调用表达式

问题描述 投票:0回答:7

我正在尝试运行 Powershell 命令来调用 7-Zip 以使用以下命令压缩文件夹:

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

输入 $command 的变量已经设置好,$SevenZip 是“c:\Program Files -Zip z.exe”

这不起作用,我正在尝试找出从 Powershell 调用 7-Zip 的最佳方法。想法?

powershell 7zip
7个回答
25
投票

我以前遇到过同样的问题。这是(几乎)直接来自我目前使用的备份脚本的代码:

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

& $pathToZipExe $arguments;

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


6
投票

您不需要使用 Invoke-Expression 只需使用调用(调用)运算符

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

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

4
投票

实际上你不需要 Invoke-Expression。您可以简单地使用与号调用命令,例如:

&$Command

但是还有 Start-Process cmdlet,它可能更适合您要执行的操作。通过将命令作为上面的字符串执行,如果 $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> 
© www.soinside.com 2019 - 2024. All rights reserved.