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



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

我有一个批处理文件位于我要运行的远程服务器上,该文件启动了自动硒测试。 为简单起见,假设我的批处理文件的名称是 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网络测试正在运行。 没有像预期的那样在远程服务器上创建 Selenium 日志文件或结果文件。

我想知道我的代码可能做错了什么。

另外,服务器似乎总是将批处理文件的回显输出返回到我的本地机器。 我在ISE上看到这些随机闪烁的白屏,看起来像批处理文件的输出

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

上述代码存在 2 个问题:

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

  • 即使$command不是未定义的,脚本块仍然只会回显其值,因为它被定义为字符串。PowerShell 不会执行字符串,除非你使用的是类似Invoke-Expression的内容(你不应该这样做)。

这应该做你想要的:

$CMD = "D:mybatch.bat"
$TargetSession = New-PSSession -ComputerName $FullComputerName -Credential $myCreds -ConfigurationName RemoteExecution  
Invoke-Command -Session $TargetSession -ScriptBlock { & $using:CMD }

如果要使用 PowerShell 远程会话从另一台计算机执行蝙蝠文件,只需输入,然后跟一个空格,然后输入位于该远程计算机上的 bat 文件的确切路径。

Invoke-Command -ComputerName RemoteComputerName -Credential $credential -ScriptBlock {. "D:TempInstall_Something.bat"}

最新更新