【问题标题】:How to pass msi ArgumentList with $ScriptDir with spaces in powershell?如何在powershell中使用带有空格的$ScriptDir传递msi ArgumentList?
【发布时间】:2018-03-23 19:35:45
【问题描述】:

我从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 选项错误

例如,如果source directory/$ScriptDirC:\Users\Dell\Desktop\New folder,则 powershell 脚本在上述消息处挂起 ..还没有安装。

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

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

    C:\Users\Dell\Desktop\New folder

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

请帮我弄清楚可能是什么原因?即使 $ScriptDir 有空格,如何解决这个问题?

【问题讨论】:

    标签: powershell scripting windows-installer


    【解决方案1】:

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

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

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

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

    这具有实际的最终结果:对于路径,将它们用三个引号括起来。

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多