Переписываем CMD файл в PowerShell

Есть у меня один скрипт, который помогает очень быстро подключаться к любому серверу, который требует моего внимания. К примеру, подключение к Linux через ssh или запуск оснастки управления AD DS и т.п. Раньше скрипт был классическим командным файлом, со своими GOTO, прочими метками и инструкциями. Теперь я его переписал под PowerShell. Были ли сложности? А как же!

Главное, что надо понять, когда вы начинаете переписывать скрипт – это идеология. В PowerShell все не так как в классической командной строке. Но есть плюсы и очень большие. К примеру, массивы и функции. Если вы уже знакомы с программированием, то переход не составит для вас труда. Но в миграции на PowerShell вы наверняка столкнетесь с некоторыми трудностями. К примеру – безопасность.

Безопасность

В PowerShell я столкнулся с проблемой привилегий при выполнении команды «Start-Process runas.exe». Ну сами посудите. В командной строке я ее запускаю, все работает, а в скрипте «недостаточно прав для ее выполнения». Добавляем параметр «-Verb RunAs» – и если вы управляете AD DS с компьютера не в домене, как я писал в предыдущей статье, то ничего не выйдет. Скрипт требует повысить права локального пользователя и как вы их не повышайте скрипт будет вылетать с ошибкой, т.к. не выполняется параметр «/user» команды runas.exe.

Не буду мучить. В начале скрипта указываем, что в рамках данной сессии мы можем из этого скрипта запускать разные программы с повышенными правами пользователя.

Set-ExecutionPolicy Bypass -Scope Process

Ошибка больше не возникает, запускается полная копия команды из командного файла. Как только скрипт завершит свою работу, права будут сброшены по умолчанию. Подробно читаем мануал на сайте Microsoft «Общие сведения о политиках выполнения PowerShell»

Не рекомендую глобально менять режим безопасности компьютера или сервера, включая изменение режима UAC. Не надо ради автоматизации своей работы делать компьютер уязвимым для всякой цифровой гадости.

Обработка исключений

Связка try catch – это все, что нужно для хорошего кода. Любое событие, которое вызывает исключение, вы можете выводить на экран, как вам угодно, каким угодно способом. К примеру. У меня список команд и запрос на выбор номера команды. При выборе срабатывает инструкция Switch и запускается команда. После того, как команда корректно запустилась стоит exit и скрипт заканчивает свою работу, т.к. он мне больше не нужен. И если возникает ошибка, то без обработчика исключений не обойтись.

Поэтому, после всех вводных параметров, указываем try и далее выводим меню, задаем параметры инструкции Switch и т.д.

В случае ошибки или иного события, которое вы хотите обработать, сработает catch и скрипт не выйдет из под вашего управления.

Цвета

Собственно, из-за того, чтобы не путаться в меню, которое содержит около 20 пунктов, я и стал мигрировать на PowerShell. Выделить цветом нужные пункты или подсветить дополнительные параметры – это то, что не критично, но бывает очень важно.

Дописываете в конце строки вывода -ForegroundColor <цвет> и вы получаете счастье. В командной строке пришлось придумывать специальный скрипт и еще мучаться с его вызовом, чтобы подсвечивались нужные мне параметры.

В завершении

Но, на мой взгляд, главный фактор для принятия решения миграции на PowerShell – это возможность управлять и контролировать выполнение своего скрипта. Плюс – упаковка данных в массивы и использование функций, которые в разы сокращают количество строк и делают код понятным.