#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"}