次の方法で共有


シェルでのコマンドの実行

PowerShell は、自動化のために使用されるコマンド ライン シェルとスクリプト言語です。 Linux の bash や Windows コマンド シェル (cmd.exe) などの他のシェルと同様に、PowerShell では、PowerShell コマンドだけではなく、システムで使用できる任意のコマンドを実行できます。

コマンドの種類

あらゆるオペレーティング システムのすべてのシェルには、次の 3 種類のコマンドがあります。

  • シェル言語キーワードは、シェルのスクリプト言語の一部です。

    • bash キーワードの例としては、ifthenelseeliffi などがあります。
    • cmd.exe キーワードの例としては、dircopymoveifecho などがあります。
    • PowerShell キーワードの例としては、forforeachtrycatchtrap などがあります。

    シェル言語キーワードは、シェルのランタイム環境内でのみ使用できます。 シェルの外部には、キーワードの機能を提供する実行可能ファイルは存在しません。

  • OS ネイティブ コマンドは、オペレーティング システムにインストールされている実行可能ファイルです。 実行可能ファイルは、PowerShell などの任意のコマンド ライン シェルから実行できます。 これには、他のシェルの適切な動作が必要になる場合があるスクリプト ファイルも含まれます。 たとえば、PowerShell で Windows バッチ スクリプト (.cmd ファイル) を実行すると、PowerShell によって cmd.exe が実行され、バッチ ファイルが渡されて実行されます。

  • シェル環境固有コマンドは、シェルのランタイム環境内でのみ使用できる外部ファイル内で定義されたコマンドです。 これにはスクリプトと関数が含まれます。または、シェルのランタイムにコマンドを追加する、特別にコンパイルされたモジュールである場合もあります。 PowerShell では、このようなコマンドは cmdlet ("コマンドレット" と読みます) と呼ばれます。

ネイティブ コマンドの実行

任意のネイティブ コマンドを PowerShell コマンド ラインから実行できます。 通常は、bashcmd.exe の場合とまったく同じようにコマンドを実行します。 次の例は、Ubuntu Linux の bashgrep コマンドを実行する方法を示しています。

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 には、他のシェルよりも多くの出力ストリームがいくつか備わっています。 bashcmd.exe シェルには stdoutstderr があります。 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 コマンドレットはネイティブ コマンドを実行するために使用できますが、コマンドの実行方法を制御する必要がある場合にのみ使用してください。 このコマンドレットには、次のシナリオをサポートするパラメーターが用意されています。

  • 別の資格情報を使ってコマンドを実行する
  • 新しいプロセスによって作成されるコンソール ウィンドウを非表示にする
  • stdinstdoutstderr ストリームをリダイレクトする
  • コマンドに対して別の作業ディレクトリを使用する

次の例では、リダイレクトされた入力ストリームと出力ストリームを使ってネイティブ コマンド 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」を参照してください。