如何在PowerShell中完整执行远程计算机上的整套脚本?
解决PowerShell远程脚本一次性执行的问题
你的问题核心在于 Enter-PSSession 的使用逻辑——这个命令是用来交互式进入远程会话的,在脚本里直接执行时,后面的Set-Location和Mstest.exe命令会等你手动退出远程会话后,才在本地机器上执行,而非在目标远程机器上运行。这就是为什么分两次执行能成功(手动进入会话后输入命令),但一次性运行失效的原因。
要实现完整脚本的一次性远程执行,你需要用 Invoke-Command 替代 Enter-PSSession,把要在远程机器上执行的命令打包成脚本块(ScriptBlock) 传递进去。下面是修改后的完整可运行脚本:
# 开启本地PS远程支持(若本地未配置过可保留,已配置则可删除) Enable-PSRemoting -Force # 定义远程机器的登录凭据 $username = "目标机器名\用户名" # 注意格式:本地账户用「机器名\用户名」,域账户用「域名\用户名」 $password = "你的密码" | ConvertTo-SecureString -Force -AsPlainText $cred = New-Object -TypeName System.Management.Automation.PSCredential ($username, $password) # 远程执行指定命令块 Invoke-Command -ComputerName "目标机器名" -Credential $cred -ScriptBlock { # 以下命令都会在远程机器上执行 Set-Location -Path "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE" .\Mstest.exe /testsettings:"D:\folder1\Local.testsettings" /TestContainer:"D:\folder1\Webtest\AssetUpload_WT.webtest" }
几个关键细节提醒:
- 用户名必须写完整格式:如果是远程机器的本地账户,要带上机器名前缀;如果是域账户,要带上域名前缀,否则容易出现凭据验证失败。
Enable-PSRemoting -Force是在本地机器开启远程支持的命令,若你的本地机器已经配置过PowerShell远程,可以直接删除这一行;如果是要给远程机器开启PSRemoting,建议提前通过远程桌面、物理登录等方式完成配置,否则第一次远程连接可能会遇到权限问题。Invoke-Command会直接在远程机器上执行脚本块内的所有命令,并将执行结果返回给本地,完全不需要手动进入交互式会话,是脚本自动化远程执行的标准方式。
内容的提问来源于stack exchange,提问作者Kiruthik
相关产品推荐
相关产品推荐

