Я пытаюсь написать сценарий PowerShell, который в конечном итоге будет использоваться в качестве автоматизации тестирования для определенного оборудования, которое использует сетевой переключатель для переключения питания на удаленную систему.
Доступ к сетевому коммутатору можно получить через интерфейс локального порта Telnet.
Моя реализация сценария PowerShell выглядит следующим образом:
test.ps1
:
Start-Process -FilePath "C:\Windows\System32\cscript.exe" -ArgumentList "C:\<path_to_file>\off.vbs";
Start-Sleep -s 10; # wait 10 seconds so that hardware powers down completely
Start-Process -FilePath "C:\Windows\System32\cscript.exe" -ArgumentList "C:\<path_to_file>\on.vbs";
off.vbs
:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /C"
WScript.Sleep 1000
WshShell.SendKeys ("telnet 172.28.104.32{Enter}")
WshShell.SendKeys ("pset 4 0{Enter}")
WshShell.SendKeys ("logout{Enter}")
WScript.Sleep 1000
WScript.Quit
on.vbs
:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /C"
WScript.Sleep 1000
WshShell.SendKeys ("telnet 172.28.104.32{Enter}")
WshShell.SendKeys ("pset 4 1{Enter}")
WshShell.SendKeys ("logout{Enter}")
WScript.Sleep 1000
WScript.Quit
Если я запустил это в консоли PowerShell, операция будет работать:
Однако, если я запускаю сценарий PowerShell, я не вижу никаких операций.
Обновлено: управляющая машина на этом ПК представляет собой ванильную коробку с Windows 10, и новое программное обеспечение не может использоваться, например, putty или plink, существует ограничение на использование встроенного исполняемого файла Windows + некоторые сценарии (причины безопасности)
cmd /c
создает оболочку, которая мгновенно завершает работу, ничего не делая; вам нужен cmd /k
, чтобы он оставался открытым. Как правило, отправка ключей и использование фиксированных интервалов сна ненадежны. cscript
запускает сценарий синхронно как консольное приложение, тогда как wscript
запускает сценарий асинхронно как приложение с графическим интерфейсом.
Не используйте SendKeys()
для автоматизации Telnet.
Уберите VBScript с картинки и просто запустите telnet прямо в PowerShell
у нас есть выбранное количество программного обеспечения на этой управляющей машине, и мы не можем добавить к нему шпатлевку / ссылку для реализации по соображениям безопасности (что вроде несправедливо) @AnsgarWiechers, связанное решение здесь не применяется
добавление cmd / k работает правильно. У меня нет опыта работы в среде Windows, но это объяснение было полезно :). Это было бы официальным решением этой проблемы с минимальными изменениями. Я действительно пробовал это с помощью только «cmd» и никаких вариантов, которые, похоже, тоже работали. Я согласен с @ mklement0, что этот вид сценариев нестабилен для выполнения с гарантированным результатом, но это быстрое исправление, пока я не найду способ переделать дизайн.
Я не хочу обидеться, но «мы используем telnet» и «мы не можем использовать стороннее программное обеспечение из-за требований безопасности» - это противоречие. Получить менее безопасный сложнее, чем telnet. Если это ваши требования, ваш процесс управления проектами нарушен.
Я не думаю, что его безопасность утверждает, что это ИТ-команда, которая управляет развертыванием этих машин с контроллерами, и потому, что они не хотят добавлять дополнительную строку к развертыванию своих контроллеров Windows 10, потому что им придется запускать регресс безопасности для любого нового представленного программного обеспечения на этой коробке. Поскольку оба устройства telnet находятся в защищенной локальной сети, я не понимаю, почему мне следует запретить использование plink, но я отвлекаюсь от @BaconBits
Изменение cscript.exe на wscript.exe, по-видимому, работает. но не уверен, почему, поскольку оба почти идентичны.