ウェブサイト検索

PowerShell 7 クロスプラットフォームのベストプラクティス


PowerShellが最初にリリースされたときの目標は、当時一般的だったGUIベースの管理をもつWindowsに強力なスクリプティングツールを提供することでした。それ以来、PowerShellは最も人気のあるスクリプティング言語の1つに成長しました。

この人気の高まりの最大の要因の一つは、マイクロソフトのPowerShellチームが2016年にオープンソースにしたことで、PowerShellバージョン6用のPowerShell Coreが導入されたことです。しかし、これによりいくつかの予期しない問題が発生しました。例えば、バージョン5.1(Windows PowerShell)とバージョン6.2(PowerShell Core)間の互換性をサポートする必要があったり、異なる.NETのバージョンで同じcmdletがわずかに異なる動作をすることがありました。

それを解決するために、PowerShellチームはPowerShell 5.1の廃止を発表し、6.2の次のバージョンはWindowsオペレーティングシステム上でWindows PowerShellを置き換えることを目指すPowerShell 7になると述べました。これにより、MacやLinuxでの互換性を犠牲にすることなく、動作させることが可能です。

PowerShell 7は昨年の3月に一般提供され、コマンドレット自体はどのオペレーティングシステムでも実行できますが、どこで実行されてもPowerShellスクリプトが円滑に動作するようにするためのベストプラクティスを守る必要があります。

小文字のディレクトリ名を使用する

Windowsオペレーティングシステムでは、

\

また、バックスラッシュ文字はファイルシステム内のネストされたディレクトリを示すために使用されますが、LinuxやmacOSでは、

/

またはスラッシュ文字はその代わりに使用され、バックスラッシュはエスケープ文字として使用されます。(これらの2つを区別するのが難しい場合は、傾いている様子を想像してみてください。バックスラッシュは後ろに倒れ、フォワードスラッシュは前に倒れます)

これはほとんどの他の言語でスクリプトを作成する際にいくつかの課題を生む可能性がありますが、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

WindowsではDateTimeオブジェクトを返し、LinuxではStringオブジェクトを返します。

スイッチ文を使用してオペレーティングシステムを判定する

時々、どんなトリックを使っても回避できない依存関係があります。その場合、PowerShell 7 にはいくつかの予約されたフラグがあり、それが返されます。

true

または

false

実行しているオペレーティングシステムによって異なります。例えば、

$IsMacOS

戻ります

True

macOSで

False

他のオペレーティングシステムでは、そして

$IsLinux

戻ります

True

どのLinuxディストリビューションを使用していても。

そこにもあります

$IsWindows

フラグ、しかし一つ大きな注意点があります:それはただ返すだけです

True

WindowsでPowerShell CoreまたはPowerShell 7を実行しているとき。それはWindows PowerShellに戻されることはなかったので、そこでは単にエラーがスローされます。

マイクロソフトのPowerShellチームのタイラー・レオンハルトは、クロスプラットフォームで実行しているときにどのOSを使用しているかを判断するための素晴らしい作業回避策を考案しました。彼がここで説明しているswitch文です。

さて、あなたはPowerShell 7のスクリプトやモジュールを、クロスプラットフォームでよりスムーズに動作させるためのいくつかの方法を考えるべきです。今日、あなたのスクリプトでそれらを試してみてください!

関連記事: