如何在PowerShell中使用带有空格的$ ScriptDir传递msi ArgumentList?

时间:2017-10-12 01:14:58

标签: powershell scripting windows-installer

我从https://powerbi.microsoft.com/en-us/downloads/下载了Powerbi 32 bit64 bit个msi文件

并在脚本下创建。

$ScriptDir = (Split-Path $MyInvocation.MyCommand.Path)


$MSIArguments = @(
    "/i"
    "$ScriptDir\PBIDesktop.msi"
    "/qn"
 #   "/norestart"
     "ACCEPT_EULA=1"
)

$MSIArguments2 = @(
    "/i"
    "$ScriptDir\PBIDesktop_x64.msi"
    "/qn"
#    "/norestart"
    "ACCEPT_EULA=1"
)

$architecture=gwmi win32_processor | select -first 1 | select addresswidth
if ($architecture.addresswidth -eq "64"){
    Start-Process "msiexec.exe" -ArgumentList $MSIArguments2 -wait
}
elseif ($architecture.addresswidth -eq "32"){
   Start-Process "msiexec.exe" -ArgumentList $MSIArguments -wait
    }
$ScriptDir

只有当source directory/$ScriptDir之间没有空格时,脚本才能完美运行。 例如,如果源目录是c:/testc:/test_test/test,则它可以完美运行。

但如果source directory/$ScriptDir有空格,则挂起时会出现msi选项错误

enter image description here

例如,如果source directory/$ScriptDirC:\Users\Dell\Desktop\New folder,则powershell脚本会挂在上面的消息中 ..但没有安装。

我在脚本末尾添加了echo以查找路径$ScriptDir

它给出了下面的回声结果,这让我更加困惑。

    C:\Users\Dell\Desktop\New folder

不确定为什么msiexec.exe在有空格时无法运行参数。

请帮我搞清楚可能是什么原因?即使$ ScriptDir有空格,怎么能修复它?

1 个答案:

答案 0 :(得分:3)

如果要从命令行调用msiexec.exe(或大多数其他命令),并在其中包含空格,则需要将该路径包装在引号中。

不幸的是,你通过它的路径实际上没有它们(尽管在哈希表中提供它们。)

为此,请提供一些转义引号(“”):

$MSIArguments = @(
    "/i"
    """$ScriptDir\PBIDesktop.msi"""
    "/qn"
 #   "/norestart"
     "ACCEPT_EULA=1"
)

这具有以下实际结果:对于路径,将它们包装在三个引号中。