PowerShell は、コマンドライン シェルであり、自動化に使用されるスクリプト言語です。 Linux 上の bash
や Windows コマンド シェル (cmd.exe
) などの他のシェルと同様に、PowerShell を使用すると、PowerShell コマンドだけでなく、システムで使用できる任意のコマンドを実行できます。
コマンドの種類
任意のオペレーティング システムのシェルには、次の 3 種類のコマンドがあります。
シェル言語キーワード は、シェルのスクリプト言語の一部です。
-
bash
キーワードの例としては、if
、then
、else
、elif
、fi
などがあります。 -
cmd.exe
キーワードの例としては、dir
、copy
、move
、if
、echo
などがあります。 - PowerShell キーワードの例としては、
for
、foreach
、try
、catch
、trap
などがあります。
シェル言語キーワードは、シェルのランタイム環境内でのみ使用できます。 シェルの外部には、キーワードの機能を提供する実行可能ファイルはありません。
-
OS ネイティブ コマンド は、オペレーティング システムにインストールされている実行可能ファイルです。 実行可能ファイルは、PowerShell などの任意のコマンド ライン シェルから実行できます。 これには、他のシェルを正常に動作させる必要があるスクリプト ファイルが含まれます。 たとえば、PowerShell で Windows バッチ スクリプト (
.cmd
ファイル) を実行すると、PowerShell はcmd.exe
を実行して、そのバッチ スクリプトを実行します。シェル環境固有のコマンド は、シェルのランタイム環境内でのみ使用できる外部ファイルで定義されたコマンドです。 これには、スクリプトと関数が含まれます。または、シェル ランタイムにコマンドを追加する特別にコンパイルされたモジュールを使用できます。 PowerShell では、これらのコマンドは コマンドレット ("command-lets" と発音) と呼ばれます。
ネイティブ コマンドの実行
任意のネイティブ コマンドを PowerShell コマンド ラインから実行できます。 通常は、bash
または cmd.exe
の場合とまったく同じようにコマンドを実行します。 次の例は、Ubuntu Linux 上の grep
で bash
コマンドを実行する方法を示しています。
sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
Ubuntu で PowerShell を起動した後、PowerShell コマンド ラインから同じコマンドを実行できます。
PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
ネイティブ コマンドに引数を渡す
ほとんどのシェルには、変数の使用、式の評価、文字列の処理のための機能が含まれています。 しかし、各シェルは、これらのことを異なる方法で行います。 PowerShell では、すべてのパラメーターはハイフン (-
) 文字で始まります。
cmd.exe
では、ほとんどのパラメーターはスラッシュ (/
) 文字を使用します。 その他のコマンド ライン ツールには、パラメーターの特殊文字が含まれていない場合があります。
各シェルには、コマンド ラインで文字列を処理および評価する独自の方法があります。 PowerShell で、文字列を特定の方法で引用符で囲むネイティブ コマンドを実行する場合は、それらの文字列を渡す方法を調整する必要があります。
詳細については、次の記事を参照してください。
PowerShell 7.2 では、ネイティブ コマンド処理を改善する新しい試験的機能 PSNativeCommandArgumentPassing
が導入されました。 詳細については、$PSNativeCommandArgumentPassing
を参照してください。
出力とエラーの処理
PowerShell には、他のシェルよりも複数の出力ストリームもあります。
bash
と cmd.exe
シェルには stdout と stderr があります。 PowerShell には、6 つの出力ストリームがあります。 詳細については、「about_Redirection と about_Output_Streams」を参照してください。
一般に、ネイティブ コマンドによって stdout に送信される出力は、PowerShell の Success ストリームに送信されます。 ネイティブ コマンドによって stderr に送信された出力は、PowerShell の エラー ストリームに送信されます。
ネイティブ コマンドに 0 以外の終了コードがある場合、$?
は $false
に設定されます。 終了コードが 0 の場合、$?
は $true
に設定されます。
ただし、これは PowerShell 7.2 で変更されました。 リダイレクト演算子 (2>&1
) を使用する場合など、ネイティブ コマンドからリダイレクトされたエラー レコードは PowerShell の $Error
変数に書き込まれず、ユーザー設定変数 $ErrorActionPreference
はリダイレクトされた出力に影響しません。
多くのネイティブ コマンドは、追加情報のための代替ストリームとして stderr に書き込みます。 この動作は、エラーを調べるとき PowerShell で混乱を引き起こす可能性があり、$ErrorActionPreference
が出力をミュートする状態に設定されていると、追加の出力情報が失われる可能性があります。
PowerShell 7.3 では、PSNativeCommandErrorActionPreference
への出力をエラーとして扱うかどうかを制御できる新しい試験的機能 stderr
が追加されました。 詳細については、$PSNativeCommandUseErrorActionPreference
を参照してください。
PowerShell コマンドの実行
前に説明したように、PowerShell コマンドはコマンドレットと呼ばれます。 コマンドレットは、必要に応じて読み込むことができる PowerShell モジュールに収集されます。 コマンドレットは、コンパイル済みの任意の .NET 言語で記述することも、PowerShell スクリプト言語自体を使用して記述することもできます。
他のコマンドを実行する PowerShell コマンド
PowerShell 呼び出し演算子 (&
) を使用すると、変数に格納され、文字列またはスクリプト ブロックで表されるコマンドを実行できます。 これを使用して、任意のネイティブ コマンドまたは PowerShell コマンドを実行できます。 これは、ネイティブ コマンドのコマンド ライン パラメーターを動的に構築する必要がある場合に、スクリプトで役立ちます。 詳細については、呼び出し演算子のを参照してください。
Start-Process
コマンドレットはネイティブ コマンドの実行に使用できますが、コマンドの実行方法を制御する必要がある場合にのみ使用してください。 コマンドレットには、次のシナリオをサポートするためのパラメーターがあります。
- 別の資格情報を使用してコマンドを実行する
- 新しいプロセスによって作成されたコンソール ウィンドウを非表示にする
- stdin、stdout、および stderr のストリームを
、 、 にリダイレクトする - コマンドに別の作業ディレクトリを使用する
次の例では、リダイレクトされた入力ストリームと出力ストリームを使用してネイティブ コマンド sort.exe
を実行します。
$processOptions = @{
FilePath = "sort.exe"
RedirectStandardInput = "TestSort.txt"
RedirectStandardOutput = "Sorted.txt"
RedirectStandardError = "SortError.txt"
UseNewEnvironment = $true
}
Start-Process @processOptions
詳細については、「Start-Process」を参照してください。
Windows では、Invoke-Item
コマンドレットは、指定した項目に対して既定のアクションを実行します。 たとえば、実行可能ファイルを実行したり、ドキュメント ファイルの種類に関連付けられているアプリケーションを使用してドキュメント ファイルを開いたりします。 既定のアクションは項目の種類によって異なり、アイテムへのアクセスを提供する PowerShell プロバイダーによって解決されます。
次の例では、既定の Web ブラウザーで PowerShell ソース コード リポジトリを開きます。
Invoke-Item https://github.com/PowerShell/PowerShell
詳細については、「Invoke-Item」を参照してください。
PowerShell