我正在尝试通过msiexec开始安装。 以下参数可用,如果我以这种方式使用它,安装将是正确的。 这是供应商提供的示例:
msiexec.exe /i ApexOne.msi MyServer="win2016-x64:8080|4343" MyDomain="WorkgroupSubdomain" /Lv+ "c:tempMSI.log"
这是我的代码:
Start-Process -FilePath "$env:systemrootsystem32msiexec.exe" -ArgumentList @('/i ".agent.msi" MyServer="servername:8080|4344" MyDomain="999-Test"') -wait
但是对于自动化,我必须使用变量$domain来生成正确的域。 我尝试了不同的代码,但没有任何帮助:
这是我的变量$domain的代码$domain='999-Test'
例:Start-Process -FilePath "$env:systemrootsystem32msiexec.exe" -ArgumentList @('/i ".agent.msi" MyServer="servername:8080|4344" MyDomain=**"$domain"'**) -wait
我也试过了,但我不知道如何解决这个失败。 我认为变量的插入是错误的,但我无法修复它。
-ArgumentList @('/i ".agent.msi"','MyServer="servername:8080|4344"','MyDomain='$domain'')
也许有人可以帮助我修复此错误?
-
由于
Start-Process
中长期存在的错误,实际上最好总是将编码在单个字符串中的目标进程的所有参数传递给-ArgumentList
(-Args
),而不是单独传递,作为数组的元素 - 请参阅此答案。 -
这样做需要两件事:
-
要合并变量值,必须使用可扩展字符串,即双引号字符串
"..."
。 -
此整个
"..."
字符串中的任何嵌入式引号本身都必须仅使用双引号,因为 Windows 上的 CLI 通常只能理解"
(双引号),而不能理解具有句法功能的'
(单引号)。要在"..."
字符串中嵌入"
字符,请将它们转义为`"
(或转义为""
;在'...'
字符串中,您根本不需要转义它们)。
-
虽然这有点麻烦,但它确实具有允许您直接控制目标进程将看到的确切命令行的优点- 这使您能够满足msiexec
挑剔的语法要求,其中PROP="value with spaces"
必须完全通过这种仅值双引号传递(而 PowerShell - 理所当然地 - 将此参数变成幕后"PROP=value with spaces"
, 当它 - 必要 -重新引用参数以合成要使用的实际命令行时)。
因此,请使用以下内容(分别使用位置参数绑定到-FilePath
和-ArgumentList
):
Start-Process -Wait $env:systemrootsystem32msiexec.exe "/i .agent.msi MyServer=`"servername:8080|4344`" MyDomain=`"999-Test`""
注意:严格来说,您不需要嵌入`"...`"
引用,因为您的属性值没有嵌入空格。
msiexec.exe程序似乎在其命令行解析器中有一些特殊之处。我推荐如下方法:
$msiFileName = ".agent.msi"
$myServer = "servername:8080|4344"
$myDomain = "999-Test"
$argumentList = @(
'/i'
'"{0}"' -f $msiFileName
'MyServer="{0}"' -f $myServer
'MyDomain="{0}"' -f $myDomain
)
$startArgs = @{
"FilePath" = "msiexec.exe"
"ArgumentList" = $argumentList
"Wait" = $true
}
Start-Process @startArgs
此示例使用单引号 ('
) 和字符串格式 (-f
) 为-ArgumentList
参数创建一个字符串参数数组。在上面的示例中,$argumentList
数组中的每个元素都是一个单独的字符串,并包含以下元素:
/i
".agent.msi"
MyServer="servername:8080|4344"
MyDomain="999-Test"
(请注意,在数组的内容中,我们保留了"
字符。
接下来,我们为Start-Process
cmdlet 创建一个哈希表,并使用@
运算符调用它。(为 cmdlet 的参数创建哈希表称为拆分,是一种以更易读和更易于维护的方式为 cmdlet 生成大量参数的便捷方法。