使用PowerShell执行调用批处理文件的远程脚本

时间:2019-04-18 14:35:16

标签: powershell selenium batch-file

我在运行位于远程服务器上的批处理文件时遇到问题。

我有一个要运行的远程服务器上的批处理文件,该文件启动了自动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上看到这些随机闪烁的白屏,看起来像批处理文件中的输出

2 个答案:

答案 0 :(得分:1)

$command = "powershell.exe -File $CMD -Wait"
Invoke-Command -Session $TargetSession -ScriptBlock { $command }

上面的代码有2个问题:

    由于作用域不同,脚本块内的
  • $command和脚本块外的$command是不同的变量。因此,脚本块内的变量是未定义的,脚本块将仅回显一个emtpy值。

  • 即使$command未被定义,脚本块仍会回显其值,因为它被定义为字符串。除非您使用Invoke-Expressionwhich 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"}