我正试图在远程计算机上安装MSI包。下面是我正在使用的脚本。在这个脚本中,invoke命令执行不会返回任何错误或成功消息。但是copy命令运行良好。任何帮助找到问题的人。
param([String]$MSILocation,[String]$RemoteComputerName,[String]$UserName,[String]$Password,[String]$Port,[String]$AccessKey,[String]$Protocol)
$ServeAdminPassword= $Password | ConvertTo-SecureString -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($UserName,$ServeAdminPassword)
$hostname = hostname
$session = New-PSSession -ComputerName $RemoteComputerName -Credential $cred
$cpy = Copy-Item $MSILocation -Destination "C:UsersAdministratorDesktop" -ToSession $session
try
{
$result = Invoke-Command -Session $session -ScriptBlock {
param($hostname,$Port,$Protocol)
$value = msiexec /i "C:UsersAdministratorDesktopsoftware.msi" SERVERNAME=$hostname PORTNO=$Port PROTOCOL=$Protocol /qb /forcerestart
calc.exe
} -ArgumentList $hostname,$Port,$Protocol | Select-Object value
}
catch
{
$result = $error[0]
echo $result
}
-
msiexec
的不同寻常之处在于,它默认异步运行,因此您需要明确等待其终止才能了解其退出代码。 -
退出代码从不通过输出(stdout(返回;相反,根据调用技术,必须查询
Process
对象的.ExitCode
属性(当使用Start-Process -Wait -PassThru
时(或使用自动$LASTEXITCODE
变量(当使用下面显示的技术时(。
强制同步执行并使退出代码反映在$LASTEXITCODE
中的一种简单方法是通过cmd /c
:调用
# Call msiexec and wait for its termination.
cmd /c "msiexec /i C:UsersAdministratorDesktopsoftware.msi SERVERNAME=$hostname PORTNO=$Port PROTOCOL=$Protocol /qb /forcerestart"
$LASTEXITCODE # Output msiexec's exit code.
有关详细信息,请参阅此答案。