PowerShellを起動する
前回の記事では、PowerShellプロンプトからコマンドプロンプト(cmd.exeが実体)を起動する例を紹介しましたが、今回は、逆にコマンドプロンプトからPowerShellのコマンドレットやスクリプトを実行する方法を紹介します。日常的なシステム管理にPowerShellを利用することを考えると、むしろこの使い方の方が重要でしょう。
コマンドレットやPowerShellスクリプトはWindowsのネイティブプログラム(EXE形式実行ファイルのように、Windowsが直接実行できるプログラム)ではありませんので、そのままではコマンドプロンプトやスタートメニューから実行できません。まずPowerShell環境を起動して、PowerShell環境を介して実行しなければなりません。
PowerShellの実体(コマンドプロンプトで言うcmd.exe)は、以下のファイルです。
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
%SystemRoot%はシステムフォルダを意味する環境変数で、一般的なWindows環境では、「C:\Windows」となります。
PowerShellのパスは環境変数PATHに登録済みですので、コマンドプロンプト、あるいはスタートメニューの「ファイル名を指定して実行」などで、「powershell」と入力するだけでPowerShellを起動できます。PowerShellのプロンプトを終了する時は、コマンドプロンプトと同様にexitと入力します。
コマンドプロンプトのウィンドウを開いたまま、別のウィンドウとしてPowerShellを起動したい時は、startコマンドを使って以下のように実行します。
start powershell
※ 既定の設定では、powershellコマンドを直接起動すると黒色の背景になります。スタートメニューからPowerShellを起動したときには紺色の背景になりますが、それはスタートメニューのPowerShellメニューでは、プロパティに色やフォントを設定してあるからです。
PowerShellコマンドレットをコマンドプロンプトから実行
コマンドプロンプトからPowerShellコマンドレットやPowerShellスクリプトを実行する方法は、PowerShellプロンプトでコマンドプロンプトの内部コマンドを実行する時とよく似ています(当連載第12回記事参照)。
コマンドプロンプト風に考えれば、PowerShellのコマンドレットやスクリプトは、PowerShellの内部コマンドだと思えばいいでしょう。PowerShellコマンドレットはWindowsのネイティブ実行プログラムではないため、PowerShell環境内でしか実行できません。そのため、コマンドプロンプトなどの非PowerShell環境でコマンドレットを実行するには、PowerShellを起動する必要があります。
powershell -Command PowerShellで実行するコマンドライン記述
たとえば、Get-ChildItem(省略形gci)をコマンドプロンプトから実行するには、コマンドプロンプトで以下のように実行します。
powershell -Command gci
PowerShellはGet-ChildItemコマンドレットを実行した後、PowerShellを終了してコマンドプロンプトに戻ります。
ただし、powershellコマンドに複数のオプションを指定する時、他のオプションは必ず-Commandオプションより前に指定して下さい。-Commandオプションより後ろの部分は、PowerShellが実行するコマンドラインとして解釈されます。
例を挙げます。
powershell -Command gci -Recurse
と実行した時、-RecurseはpowershellコマンドへのオプションではなくGet-ChildItem(gci)へのオプションです。powershellにオプション...例えば-NoExit...を追加したいのであれば、以下のように-Commandオプションの前に入れます。-NoExitは、コマンドレット終了後もPowerShellを終了せずにPowerShellプロンプトを残すオプションです。
powershell -NoExit -Command gci
※ 複数のコマンドレットやスクリプトを実行する時は、PowerShellプロンプトで実行する時と同様、セミコロン「;」で区切って複数のコマンドラインを列挙できます。
パイプライン記述
PowerShellのパイプラインを使用する時は、PowerShellで実行するコマンドラインをダブルクォーテーション" "でくくって下さい。以下のような書式になります。
powershell -Command "PowerShellのコマンドライン"
たとえば、Get-ChildItem(gci)の出力をFormat-Wide(省略形fw)で整形して表示するとき...
powershell -Command gci | fw
と実行しても期待したように動作しません。この場合のパイプラインはコマンドプロンプト(cmd.exe)のパイプラインとして解釈されるため、「powershell -Command gci」の実行結果を、コマンドプロンプトの「fw」というコマンドで処理しようとします。
PowerShellのFormat-Wideコマンドレットで処理するためには、以下のように実行します。
powershell -Command "gci | fw"
このように実行すれば、「gci | fw」をPowerShell内で実行し、その結果を表示します。
PowerShellスクリプトの実行
PowerShellスクリプトを実行する時も、コマンドレットと同様にpowershellコマンドから実行できます。
powershell -Command PowerShellスクリプトファイル名
たとえば、「Hello」と表示するスクリプトSayHello.ps1をカレントディレクトリに作成して実行するとき、コマンドプロンプトからは以下のように実行します。
powershell -Command .\SayHello
※ スクリプトが環境変数PATHで指定したディレクトリ(フォルダ)に保存してあれば、スクリプトをパス付きで記述する必要はありません。
こうした、コマンドプロンプトからPowerShellのコマンドレットやスクリプトを実行する手法の習得は、システム管理にPowerShellを活用する上で非常に重要です。
システム管理では、しばしば作業を自動実行したいことがあります。定時に実行する、あるいはログオン、ログオフなどのイベント発生時に自動実行するなど。ただ、Windowsのタスクスケジューラをはじめとする自動実行サービス、ユーティリティは、PowerShellスクリプトには対応していません。EXE形式の実行ファイルを起動するのが基本です。これではせっかくPowerShellで作成したスクリプトを活かせません。そこで、EXE形式実行ファイルであるPowerShell環境からスクリプトを起動するのです。
例えば、あるファイルをバックアップするスクリプトを、C:\PSScriptsフォルダに、BackupItems.ps1として作成します。これを定時に実行するのであれば、タスクスケジューラで以下のように実行プログラムを登録します。
powershell -Command C:\PSScripts\BackupItems.ps1
※ PowerShellコマンドプロンプトから実行する時と同様、実行するスクリプトファイル名はフルパスで指定します。または、自動実行するスクリプトファイルを保存したフォルダを環境変数PATHに登録します。
同様にPowerShellスクリプトなどをデスクトップやスタートメニューから実行したい時も同様です。ショートカットを作成する時(デスクトップを右クリックして、「新規作成」-「ショートカット」メニューを実行)、「項目の場所」に「powershell -Command ~」と入力すれば、ショートカットやスタートメニューから直接PowerShellコマンドレットやスクリプトを起動できます。