我在运行位于远程服务器上的批处理文件时遇到问题。
我有一个要运行的远程服务器上的批处理文件,该文件启动了自动Selenium测试。为了简单起见,假设我的批处理文件的名称是mybatch.bat
我在服务器上的Powershell脚本中有以下代码:
$BatchFile = "mybatch.bat"
Start-Process -FilePath $BatchFile -Wait -Verb RunAs
如果我在ISE中的服务器上本地运行此PowerShell脚本,则它运行良好,并且启动了硒测试,该测试需要几分钟才能运行。
现在,我想尝试使用PowerShell远程处理从另一台计算机执行此测试。假设服务器上已经配置了远程处理。
我在另一个具有以下代码段的服务器上有一个PowerShell脚本。假设所有会话变量都设置了正确的信息:
$CMD = "D:\mybatch.bat"
$TargetSession = New-PSSession -ComputerName $FullComputerName -Credential $myCreds -ConfigurationName RemoteExecution
$command = "powershell.exe -File $CMD -Wait"
Invoke-Command -Session $TargetSession -ScriptBlock { $command }
此脚本运行时,确实会连接到远程计算机并创建一个远程会话。它看起来确实启动了批处理文件,因为PowerShell不会给我错误。但是,它不会等待整个3或4分钟的时间完成硒测试。似乎只是超时了。另外,如果我登录到另一台计算机,则看不到任何Selenium Web测试正在运行。预期不会在远程服务器上创建Selenium日志文件或结果文件。
我想知道我的代码可能做错了什么。
此外,服务器似乎总是将批处理文件的回显输出返回到我的本地计算机。我在ISE上看到这些随机闪烁的白屏,看起来像批处理文件中的输出
答案 0 :(得分:1)
$command = "powershell.exe -File $CMD -Wait"
Invoke-Command -Session $TargetSession -ScriptBlock { $command }
上面的代码有2个问题:
$command
和脚本块外的$command
是不同的变量。因此,脚本块内的变量是未定义的,脚本块将仅回显一个emtpy值。
即使$command
未被定义,脚本块仍会回显其值,因为它被定义为字符串。除非您使用Invoke-Expression
(which you shouldn't)之类的东西,否则PowerShell不会执行字符串。
这应该做您想要的:
$CMD = "D:\mybatch.bat"
$TargetSession = New-PSSession -ComputerName $FullComputerName -Credential $myCreds -ConfigurationName RemoteExecution
Invoke-Command -Session $TargetSession -ScriptBlock { & $using:CMD }
答案 1 :(得分:0)
如果要使用PowerShell远程会话从另一台计算机执行bat文件,只需输入点,然后跟随一个空格,然后输入位于该远程计算机上的bat文件的确切路径
示例
Invoke-Command -ComputerName RemoteComputerName -Credential $credential -ScriptBlock {. "D:\Temp\Install_Something.bat"}