Использование PowerShell для выполнения удаленного скрипта, вызывающего пакетный файл

#powershell #selenium #batch-file

#powershell #selenium #пакетный файл

Вопрос:

У меня возникла проблема с запуском пакетного файла, расположенного на удаленном сервере.

У меня есть пакетный файл, расположенный на удаленном сервере, который я хочу запустить, который запускает автоматический тест Selenium. Для простоты предположим, что имя моего пакетного файла — mybatch.bat

У меня есть следующий код в сценарии Powershell, расположенном на сервере:

 $BatchFile = "mybatch.bat"

Start-Process -FilePath $BatchFile -Wait  -Verb RunAs 
 

Если я запускаю этот сценарий PowerShell локально на сервере в ISE, он работает нормально и запускает тест selenium, выполнение которого занимает пару минут.

Теперь я хочу попробовать выполнить этот тест с другого компьютера, используя PowerShell remoting. Предположим, что удаленное взаимодействие уже настроено на серверах.

У меня есть сценарий 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 не выдает мне ошибку. Но он не ожидает завершения теста Selenium в течение полных 3 или 4 минут. Похоже, что время ожидания истекло. Кроме того, если я вошел в систему на другом компьютере, я не вижу никакого запущенного веб-теста Selenium. На удаленном сервере не создаются файлы журнала Selenium или файлы результатов, как и следовало ожидать.

Мне было интересно, что я мог делать неправильно с моим кодом.

Кроме того, кажется, что сервер всегда возвращает эхо-выходные данные пакетного файла на мой локальный компьютер. Я вижу этот случайный мигающий белый экран на ISE, который выглядит как вывод из пакетного файла

Комментарии:

1. добавьте в свой скрипт некоторое ведение журнала. я подозреваю, что вы видите проблему «двойного перехода»… и попытка получить доступ к файлу BAT приводит к ошибке «отказано в доступе».

Ответ №1:

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

В приведенном выше коде есть 2 проблемы:

  • $command внутри scriptblock и $command вне scriptblock разные переменные из-за разных областей. Таким образом, переменная внутри scriptblock не определена, и scriptblock просто отобразит значение emtpy.
  • Даже если $command бы не было undefined , scriptblock все равно просто повторил бы свое значение, поскольку оно определено как строка. PowerShell не выполняет строки, если вы не используете что-то вроде Invoke-Expression (чего не следует).

Это должно делать то, что вы хотите:

 $CMD = "D:mybatch.bat"

$TargetSession = New-PSSession -ComputerName $FullComputerName -Credential $myCreds -ConfigurationName RemoteExecution  

Invoke-Command -Session $TargetSession -ScriptBlock { amp; $using:CMD }
 

Комментарии:

1. Ансгар, спасибо за вашу помощь. Новая команда Invoke, похоже, запускает удаленный сценарий Powershell, потому что я вижу информацию о регистрации вывода в моем сценарии ISE. Но мой командный файл selenium, похоже, не запускается. Должен ли я попробовать использовать Invoke-Command в сценарии Powershell и на удаленном сервере? Что-то вроде этого: Invoke-Command -ScriptBlock { amp; используя:$BatchFile }

2. Мне пришлось изменить выполнение пакетного файла в удаленном Powershell на этот синтаксис, чтобы он работал: amp; $BatchFile

Ответ №2:

Если вы хотите запустить файл bat с другого компьютера с помощью удаленного сеанса PowerShell, просто введите точку, а затем пробел, затем введите точный путь к файлу bat, расположенному на этом удаленном компьютере.

Пример

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