PowerShell远程安装:Start-Process路径变量使用异常求助
解决远程执行msiexec时变量传入导致的安装挂起问题
问题根源在于远程脚本块无法直接访问本地变量:你在Invoke-Command的脚本块里用的$FileName,在远程会话中是未定义的——相当于msiexec收到的路径是c:\而非c:\test.msi,找不到安装包导致进程异常终止,再加上-Wait参数,就会一直挂起等待不存在的进程完成。直接写死文件名能正常运行,也验证了安装包本身和路径没问题,问题出在变量传递上。
下面是几种可行的解决方法:
方法1:使用Using作用域修饰符(推荐,PowerShell 3.0+支持)
通过$Using:变量名让远程会话直接引用本地变量:
Invoke-Command -ComputerName $ComputerName -ScriptBlock { Start-Process msiexec "/i c:\$Using:FileName /lvx* c:\PackageManagement.log" -Wait }
方法2:通过-ArgumentList传递变量(兼容旧版本PowerShell)
把本地变量作为参数传给远程脚本块,用$args接收使用:
Invoke-Command -ComputerName $ComputerName -ScriptBlock { $localFileName = $args[0] Start-Process msiexec "/i c:\$localFileName /lvx* c:\PackageManagement.log" -Wait } -ArgumentList $FileName
方法3:拆分msiexec参数为数组(更规范,避免字符串拼接问题)
把msiexec的每个参数单独作为数组元素传入,这种方式能避免路径含特殊字符时的解析错误,也更易维护:
Invoke-Command -ComputerName $ComputerName -ScriptBlock { $msiFullPath = Join-Path -Path 'C:\' -ChildPath $Using:FileName Start-Process msiexec -ArgumentList "/i", $msiFullPath, "/lvx*", "c:\PackageManagement.log" -Wait }
内容的提问来源于stack exchange,提问作者Owen S
相关产品推荐
相关产品推荐

