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

powershell - 如何在Powershell中使用$ ScriptDir和$ ScriptDir传递msi ArgumentList?-LMLPHP

例如,如果source directory/$ScriptDirC:\Users\Dell\Desktop\New folder,则powershell脚本会卡在上面的消息上
..尚未安装。

我在脚本的末尾添加了echo以查找路径$ScriptDir
它给下面的回声结果,这让我更加困惑。
    C:\Users\Dell\Desktop\New folder

不知道为什么有空格时msiexec.exe无法运行参数。

请帮我弄清楚是什么原因?即使$ ScriptDir包含空格,如何将其固定运行?

最佳答案

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

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

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

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

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

关于powershell - 如何在Powershell中使用$ ScriptDir和$ ScriptDir传递msi ArgumentList?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46699870/

10-10 05:04