使用不替换 PARAM 的参数调用 PowerShell 以安装 MSI
PowerShell Invoke with parameters not substituting PARAM for installing MSI
我正在尝试使用 Power-shells Invoke 运行 MSI 安装。
此代码不是 运行MSI 安装。
param ($path1, $path2, $path3)
write-output "path1= $path1"
write-output "path2= $path2"
write-output "path3= $path3"
$PathToMSI = "D:\Install$path1\'$path2$path3'"
write-output "PathToMSI= $PathToMSI"
$scriptblock = {Start-Process msiexec.exe -Argumentlist "/i $PathToMSI","/qn"}
invoke-command -scriptblock $scriptblock
我知道我的 PathToMSI 是正确的,因为这是显示的,但它没有执行。
path1= 20191213.3
path2= X Y Z
path3= .msi
PathToMSI= D:\Install191213.3\'X Y Z.msi'
如果我运行它硬编码它有效吗?
Invoke-Command -ScriptBlock {
D:\install191213.3\'X Y Z.msi' /quiet
}
PathToMSI 似乎没有解析到它的值。
我评论了一些像 Error invoking command to install a Msi through Powershell
您需要将 $PathToMSI
传递给 ScriptBlock
。您可以为此使用 -ArgumentList
:
Invoke-Command -ArgumentList $PathToMSI -ScriptBlock {
Start-Process msiexec.exe -Argumentlist '/i', $args[0], '/qn'
}
或者您可以使用 $using:
scope 如果在远程计算机上调用:
Invoke-Command -ComputerName server.domain.tld -ScriptBlock {
Start-Process msiexec.exe -Argumentlist '/i', $using:PathToMSI, '/qn'
}
Invoke-Command
在新的 PowerShell 会话中运行您的 ScriptBlock
,该会话不知道您可能已声明的任何局部变量。 $using
范围将查找父会话以获取变量解析,而 -ArgumentList
将传递可以使用 ScriptBlock
.[=23 中的 $args
变量引用的文字变量=]
我正在尝试使用 Power-shells Invoke 运行 MSI 安装。
此代码不是 运行MSI 安装。
param ($path1, $path2, $path3)
write-output "path1= $path1"
write-output "path2= $path2"
write-output "path3= $path3"
$PathToMSI = "D:\Install$path1\'$path2$path3'"
write-output "PathToMSI= $PathToMSI"
$scriptblock = {Start-Process msiexec.exe -Argumentlist "/i $PathToMSI","/qn"}
invoke-command -scriptblock $scriptblock
我知道我的 PathToMSI 是正确的,因为这是显示的,但它没有执行。
path1= 20191213.3
path2= X Y Z
path3= .msi
PathToMSI= D:\Install191213.3\'X Y Z.msi'
如果我运行它硬编码它有效吗?
Invoke-Command -ScriptBlock {
D:\install191213.3\'X Y Z.msi' /quiet
}
PathToMSI 似乎没有解析到它的值。 我评论了一些像 Error invoking command to install a Msi through Powershell
您需要将 $PathToMSI
传递给 ScriptBlock
。您可以为此使用 -ArgumentList
:
Invoke-Command -ArgumentList $PathToMSI -ScriptBlock {
Start-Process msiexec.exe -Argumentlist '/i', $args[0], '/qn'
}
或者您可以使用 $using:
scope 如果在远程计算机上调用:
Invoke-Command -ComputerName server.domain.tld -ScriptBlock {
Start-Process msiexec.exe -Argumentlist '/i', $using:PathToMSI, '/qn'
}
Invoke-Command
在新的 PowerShell 会话中运行您的 ScriptBlock
,该会话不知道您可能已声明的任何局部变量。 $using
范围将查找父会话以获取变量解析,而 -ArgumentList
将传递可以使用 ScriptBlock
.[=23 中的 $args
变量引用的文字变量=]