如何抑制PowerShell命令中的可执行文件引用

Dav*_*ter 4 powershell msiexec

有没有办法抑制PowerShell喜欢生成的每个命令行参数周围的括号引号,然后传递给包含空格的命令行参数的外部可执行文件?

情况如下:

解压许多安装程序的一种方法是使用以下形式的命令:

msiexec /a <packagename> /qn TARGETDIR="<path to folder with spaces>"
Run Code Online (Sandbox Code Playgroud)

尝试从PowerShell执行此操作已经证明非常困难.PowerShell喜欢用双引号括起空格参数.以下行:

msiexec /a somepackage.msi /qn 'TARGETDIR="c:\some path"'

msiexec /a somepackage.msi /qn $('TARGETDIR="c:\some path"')

$td = '"c:\some path"'

msiexec /a somepackage.msi /qn TARGETDIR=$td
Run Code Online (Sandbox Code Playgroud)

所有结果都生成以下命令行(由Win32 GetCommandLine()API报告):

"msiexec" /a somepackage.msi /qn "TARGETDIR="c:\some path""
Run Code Online (Sandbox Code Playgroud)

这个命令行:

msiexec /a somepackage.msi TARGETDIR="c:\some path" /qn
Run Code Online (Sandbox Code Playgroud)

结果是

"msiexec" /a fooinstaller.msi "TARGETDIR=c:\some path" /qn
Run Code Online (Sandbox Code Playgroud)

似乎PowerShell在将表达式传递给外部可执行文件时,希望将表达式的结果用于表示引号中的一个参数.这适用于大多数可执行文件.但是,MsiExec非常关注它想要的引用规则,并且不接受PowerShell为路径生成的任何命令行.

有没有办法抑制这种行为?

ste*_*tej 8

像这样逃避内部引号:

msiexec /a somepackage.msi TARGETDIR=`"c:\some path`" /qn
Run Code Online (Sandbox Code Playgroud)


Chr*_*les 7

这是一个我用来更好地处理多个参数的函数以及带有空格和引号的函数.请注意,对于下面的代码块,不要在字符串正确开始和结束的位置着色,并且必须使用`来转义参数中所需的引号.

function InstallMSIClient{
$Arguments = @()
$Arguments += "/i"
$Arguments += "`"$InstallerFolder\$InstallerVerFolder\Install.msi`""
$Arguments += "RebootYesNo=`"No`""
$Arguments += "REBOOT=`"Suppress`""
$Arguments += "ALLUSERS=`"1`""
$Arguments += "/passive"

Write-Host "Installing $InstallerVerFolder."
Start-Process "msiexec.exe" -ArgumentList $Arguments -Wait }
Run Code Online (Sandbox Code Playgroud)

我的博客上有一个更完整的例子.[ http://www.christowles.com]