シェルでのコマンドの実行
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 では、このようなコマンドは cmdlet ("コマンドレット" と読みます) と呼ばれます。
ネイティブ コマンドの実行
任意のネイティブ コマンドを PowerShell コマンド ラインから実行できます。 通常は、bash
や cmd.exe
の場合とまったく同じようにコマンドを実行します。 次の例は、Ubuntu Linux の bash
で grep
コマンドを実行する方法を示しています。
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 の Error ストリームに送信されます。
ネイティブ コマンドの終了コードがゼロ以外の場合、$?
は $false
に設定されます。 終了コードがゼロの場合、$?
は $true
に設定されます。
ただし、これは PowerShell 7.2 で変更されました。 ネイティブ コマンドからリダイレクトされるエラー レコード (リダイレクト演算子 (2>&1
) を使用する場合のように) が、PowerShell の $Error
変数に書き込まれず、ユーザー設定変数 $ErrorActionPreference
はリダイレクトされた出力に影響しません。
多くのネイティブ コマンドでは、追加情報の代替ストリームとして stderr に書き込みが行われます。 この動作により、PowerShell でエラーを探すときに混乱が生じる可能性があります。また、$ErrorActionPreference
が出力をミュートする状態に設定されている場合は、追加の出力情報が失われるおそれがあります。
PowerShell 7.3 では、stderr
への出力をエラーとして扱うかどうかを制御できる、新しい試験的機能 PSnativeCommandErrorActionPreference
が追加されました。 詳細については、「PSnativeCommandErrorActionPreference」を参照してください。
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
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示