Поиск по сайту:

Рекомендации по межплатформенной работе с PowerShell 7


Когда PowerShell был впервые выпущен, целью было внедрить мощные инструменты сценариев в Windows, которая в то время обычно имела администрирование на основе графического интерфейса. С тех пор PowerShell стал одним из самых популярных языков сценариев.

Одним из главных факторов роста популярности является то, что команда PowerShell в Microsoft сделала его открытым исходным кодом в 2016 году, представив PowerShell Core для PowerShell версии 6. Однако это вызвало некоторые неожиданные проблемы, такие как необходимость поддерживать совместимость между версиями 5.1 ( Windows PowerShell) и версии 6.2 (PowerShell Core), или использование одних и тех же командлетов, выполняющих несколько разные действия в разных версиях .NET.

Чтобы решить эту проблему, команда PowerShell объявила об отказе от PowerShell 5.1 и о том, что следующей версией после 6.2 будет PowerShell 7, цель которой — заменить Windows PowerShell в операционных системах Windows без ущерба для совместимости при работе на Mac или Linux.

Общедоступная версия PowerShell 7 была выпущена в марте прошлого года, и хотя сами командлеты работают в любой операционной системе, все же существуют некоторые рекомендации, которым необходимо следовать, чтобы обеспечить бесперебойную работу сценариев PowerShell независимо от того, где они выполняются.

Используйте имена каталогов в нижнем регистре

В операционной системе Windows символ \ или символ обратной косой черты используется для обозначения вложенных каталогов в файловой системе, тогда как в Linux и macOS используется символ / или символ косой черты. вместо этого и обратная косая черта используется в качестве escape-символа. (Если у вас когда-нибудь возникнут проблемы с тем, чтобы держать эти два прямо, просто представьте, что они опрокидываются. Обратная косая черта падает назад, прямая косая черта падает вперед)

Это может вызвать некоторые проблемы при написании сценариев на большинстве других языков, но PowerShell 7 преобразует любой из них в объект каталога и не заботится о символах, используемых для разделения пути. Одна из областей, где вы можете столкнуться с проблемами, заключается в том, что файловые системы Linux и macOS заботятся о прописных буквах и будут рассматривать имена каталогов в разных случаях как разные каталоги.

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

Не используйте псевдонимы

Псевдонимы могут быть отличным способом сократить объем ввода, который вам нужно вводить при запуске PowerShell из консоли. Гораздо проще набирать ls или cgi, чем Get-ChildItem, даже с завершением табуляции. При этом использование псевдонимов в сценариях редко является хорошей идеей, потому что это делает сценарий зависимым от установки этого псевдонима, где бы он ни выполнялся.

Это особенно верно для систем Linux и macOS. На этих платформах вместо использования псевдонима для запуска другой команды PowerShell выполняется собственная команда, а это означает, что возвращаемый объект будет сильно отличаться, и это отбросит остальную часть скрипта.

ls и Get-ChildItem, работающие в Windows 10 и Ubuntu Linux.

Некоторые команды, такие как ls, могут измениться не слишком сильно, но с другими, такими как команда date, PowerShell возвращает совершенно другой объект, отличный от родной команды Linux, который отбрасывает все, что зависит от вывода позже в коде. Даже если вам просто нужно строковое значение в сценарии PowerShell, используйте PowerShell для его получения.

date возвращает объект DateTime в Windows и объект String в Linux.

Используйте оператор Switch для определения операционной системы

Иногда у вас есть зависимость, которую вы не можете обойти в сценарии, независимо от того, какие приемы вы используете. В таких случаях в PowerShell 7 есть несколько зарезервированных флагов, которые будут возвращать true или false в зависимости от того, в какой операционной системе вы работаете. Например, $IsMacOS вернет True в macOS и False в любой другой операционной системе, а $IsLinux вернет возвращать True независимо от того, какой у вас дистрибутив Linux.

Существует также флаг $IsWindows, но с одной большой оговоркой: он возвращает True только при запуске PowerShell Core или PowerShell 7 в Windows. Он никогда не переносился обратно в Windows PowerShell, поэтому при запуске он просто выдаст ошибку.

Тайлер Леонхардт из команды PowerShell в Microsoft придумал отличный обходной путь для определения того, на какой ОС вы работаете, когда работаете на разных платформах, и это оператор switch, который он описывает здесь.

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