powershell - PowerShell调用的参数未替换PARAM来安装MSI

标签 powershell tfs

我正在尝试使用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:\Install\20191213.3\'X Y Z.msi'

如果我对其进行硬编码,是否可以使用?
Invoke-Command -ScriptBlock {
    D:\install\20191213.3\'X Y Z.msi' /quiet
}

似乎PathToMSI并未解决其值(value)。
我已经评论了一些像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 session 中运行ScriptBlock,该 session 不知道您可能已声明了任何局部变量。 $using范围将向父 session 寻求变量解析,而-ArgumentList将传递可使用$args中的ScriptBlock变量引用的文字变量。

关于powershell - PowerShell调用的参数未替换PARAM来安装MSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59427792/

相关文章:

regex - 在 PowerShell 中仅删除 CSV 引号中的逗号

powershell - 如何检查数组中的一行是否包含另一个数组中的内容

windows - PSCP 可以与 PowerShell 一起使用吗?

tfs - 何时根据功能请求创建 PBI,以及在何处划分它们的界线?

tfs - 使用 InvalidNotOldValue 创建 TFS Bug 验证失败

powershell - 执行 Get-AzureKeyVaultSecret 时服务主体未经授权

powershell - 为什么 PowerShell 告诉我字符串不是字符串?并且只有在调用 String.Length 时,首先

tfs - 使用命令行实用程序查找具有关联工作项的变更集

command-line - 用于切换工作空间的 TFS 命令

rest - 通过提交 SHA1 获取构建状态