Windows PowerShell: 歴史を忘れる者

Windows PowerShell では、2 とおりの方法で、最近使ったコマンドを呼び出すことが可能で、この機能はおおいに役立ちます。

Don Jones

「歴史を忘れる者は、それを繰り返す羽目になる」という古いことわざがあります。ですが、Windows PowerShell では、歴史を繰り返したいので、過去に実行したコマンドを正確に覚えておく必要があります。Windows PowerShell では、最近実行したコマンドが自動的に記憶され、バッファー (つまり、履歴) に保持されるので、過去に実行したコマンドを簡単に呼び戻して、再実行することができます。

履歴のオプション

Windows PowerShell コンソールを使用しているときには、2 種類のコマンドの履歴が利用できます。この 2 つの履歴は完全に独立しており、何の関係もありません。

1 つはコマンド ラインのバッファーです。これは、おそらくなじみがあるものだと思います。これは上矢印キーを押して、最近実行したコマンドを呼び出すときに表示されます。F7 キーを押して、最近実行したコマンドのメニューを表示することもできます。メニューが表示されたら、矢印キーを使用してコマンドを選択し、Enter キーを押すと、選択したコマンドが実行されます。

コマンド ラインのバッファーの既定の設定では、最近実行した 50 個のコマンドが保持されます。この設定は、コンソール ウィンドウのプロパティを編集して、調整できます。ウィンドウのタイトル バーを右クリックし、[プロパティ] をクリックします。次に、[オプション] タブの [コマンドの履歴] で [バッファ サイズ] ボックスの値を変更します。

このコマンドの履歴は、Windows PowerShell とは個別に管理されており、コンソールをホストしているアプリケーションで管理されています。Windows PowerShell では、この履歴が存在することも認識していません。

便利な履歴

Windows PowerShell で管理している履歴の方が便利です。「Get-Command –noun history」というコマンドを実行すると、この拡張された履歴のログを操作する次の 4 つの組み込みのコマンドレットが表示されます。

  • Add-History
  • Clear-History
  • Get-History
  • Invoke-History

また、$MaximumHistoryCount という組み込みの変数もあります。この変数では、Windows PowerShell が保持しているコマンド履歴のバッファーのサイズを設定します。既定では、この変数には 64 という値が設定されています。この値を変更する場合に必要なことは、この変数に新しい値を設定するだけです。変更は、現在のシェル セッションでのみ有効になります。永続的な変更を加えるには、プロファイル スクリプトに次のようなコードを追加します。

$MaximumHistoryCount = 100

これには、(マイ) ドキュメント\WindowsPowerShell\profile.ps1 という名前のファイルの編集が必要になります。シェルが検索して、自動的に実行されるプロファイル スクリプトは 4 つありますが、これは、その中の 1 つです。

ここで主に使用するのは Get-History コマンドレットです。というのも、これが 4 つのコマンドレットの中で一番便利だからです。このコマンドレットでは HistoryInfo という種類のオブジェクトを生成します。HistoryInfo オブジェクトには、次の 4 つの便利なプロパティがあります。

  • CommandLine: 実際に実行されたコマンド
  • StartExecutionTime: コマンドの実行開始時刻
  • EndExecutionTime: コマンドの実行終了時刻
  • ExecutionStatus: 実行後のコマンドの状態 (Completed や Stopped など)

このオブジェクトを他の Windows PowerShell コマンドと組み合わせて使用すると、とても便利な処理を行えるようになります。たとえば、新しいシェル ウィンドウを開いて、いくつかのコマンドを苦労して実行して複雑なタスクを完了したとします。この一連のコマンドをスクリプトにして、これらのコマンドを同じ順序で何度も実行できるようにしたい場合に必要な作業は、次のコマンドを実行するだけです。

Get-History | Select –Expand CommandLine | Out-File script.ps1

ここで鍵となるのは、Select-Object コマンドレットの –ExpandProperty パラメーターです。このパラメーターを指定すると、Select-Object コマンドレットでは、指定したプロパティのコンテンツのみを出力します。この場合は、HistoryInfo オブジェクトの CommandLine プロパティのコンテンツのみが出力されます。このプロパティには、最近実行したコマンドのテキストが含まれています。Windows PowerShell ISE または他のスクリプト エディターを使用して、生成された Script.ps1 を編集して、コマンドを編集したり、ハードコードされた値をパラメーターに変更したり、不要なコマンドを削除したりすることができます。

この方法を使用して、次の Script.ps1 ファイルを生成したとします。

Import-Module ActiveDirectory
Import-CSV users.csv
Import-CSV users.csv | New-ADUser –path "ou=sales,dc=company,dc=com"

これは、短いコマンドですが、これらのコマンドを対話的に実行することで、各コマンドが機能することを 1 つずつ確認できます。実際、2 つ目のコマンドでは、CSV ファイルのインポート処理をテストしていることがわかります。このようにテストすることで、csv に必要なデータが格納されていることを確認できます。今度は、スクリプトを調整して、パラメーターを追加できます。

Param(
  [string]$filename = &(Read-Host "Specify input CSV filename"),
  [string]$path = "cn=Users,dc=company,dc=com"
)
Import-Module ActiveDirectory
Import-CSV $filename | New-ADUser –path $path

CSV のインポートをテストするコマンドと追加パラメーターにより、スクリプトの実行時に CSV のファイル名とインポートする OU の情報を収集できます。これは、CSV のファイル名と OU の値をハードコーディングするよりも適切なアプローチです。このスクリプトを実行したユーザーがファイル名を指定し忘れた場合には、ファイル名の入力を求めるようにします (ただし、このように確認するのはスマートな方法ではなく、高度な関数では、より簡潔で一貫性のある方法で対応できます)。2 つ目のパラメーターには、スクリプトを実行したユーザーが値を指定しなかった場合に使用する既定値を指定します。

これは 1 回手動で実行した操作を他のユーザーが再実行可能な一連の操作に変換するための簡単な方法です。

その他の履歴に関する秘訣

コマンド ラインの履歴の取得に関する秘訣は他にも多数あります。たとえば、次のようなものがあります。

  • Get-History | Export-CliXMLfilename というコマンドを実行すると、コマンドの履歴を XML ファイルにエクスポートできます。生成された XML ファイルを同僚に送信すると、同僚は Import-CliXMLfilename | Invoke-History というコマンドを実行して、これらのコマンドを再実行することができます。
  • StartExecutionTime プロパティと EndExecutionTime プロパティを使用して、コマンドの実行にかかった時間を測定できます。たとえば、get-history | select commandline,executionstatus,startexecutiontime,endexecutiontime,@{n='ExecutionDuration';e={$_.EndExecutionTime - $_.StartExecutionTime}} というコマンドを実行します。
  • 上矢印キーを使わずに、過去に実行したコマンドを簡単に見つけることができます。たとえば、Select という表現を含むコマンドを実行したことを把握している場合には、「get-history | where { $_.CommandLine -like '*select*' }」というコマンドを実行します。

いつものように、Windows PowerShell では、すべてのものをテキストではなくオブジェクトとして処理します。そのため、テキスト形式のログ ファイルなどの扱いづらいものを調べているときよりも、このような検索処理やフィルター処理が実用的に行えます。

Don Jones

Don Jones は、Microsoft MVP の受賞者で、『Learn Windows PowerShell in a Month of Lunches』(Manning Publications Co.、2010 年) の著者でもあります。この書籍は、管理者が Windows PowerShell を効率的に使用できるようにすることを目的としています。また、一般ユーザーを対象にオンサイトの Windows PowerShell トレーニングも開催しています。Don に対するお問い合わせについては、彼の Web サイト (ConcentratedTech.com、英語) を参照してください。

関連コンテンツ