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」コマンドを実行。プロンプトが変化し、PowerShellプロンプトになっています。

コマンドプロンプトのウィンドウを開いたまま、別のウィンドウとしてPowerShellを起動したい時は、startコマンドを使って以下のように実行します。

start  powershell

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

Get-ChildItemをコマンドプロンプトから実行する場合、「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

-NoExitオプション付きで実行したため、コマンドレット実行後もPowerShellは終了せず、PowerShellプロンプトが表示された状態。

※ 複数のコマンドレットやスクリプトを実行する時は、PowerShellプロンプトで実行する時と同様、セミコロン「;」で区切って複数のコマンドラインを列挙できます。

パイプライン記述

PowerShellのパイプラインを使用する時は、PowerShellで実行するコマンドラインをダブルクォーテーション" "でくくって下さい。以下のような書式になります。

powershell -Command  "PowerShellのコマンドライン"

たとえば、Get-ChildItem(gci)の出力をFormat-Wide(省略形fw)で整形して表示するとき...

powershell  -Command gci  |  fw

と実行しても期待したように動作しません。この場合のパイプラインはコマンドプロンプト(cmd.exe)のパイプラインとして解釈されるため、「powershell -Command gci」の実行結果を、コマンドプロンプトの「fw」というコマンドで処理しようとします。

cmd.exeは、「powershell -Command gci」の実行結果をfwに流そうとしますが、コマンドプロンプトで使えるfwというコマンドがないためにエラーになります。

PowerShellのFormat-Wideコマンドレットで処理するためには、以下のように実行します。

powershell  -Command  "gci  |  fw"

このように実行すれば、「gci | fw」をPowerShell内で実行し、その結果を表示します。

「gci | fw」をPowerShell内で実行して、結果を表示。

PowerShellスクリプトの実行

PowerShellスクリプトを実行する時も、コマンドレットと同様にpowershellコマンドから実行できます。

powershell  -Command  PowerShellスクリプトファイル名

たとえば、「Hello」と表示するスクリプトSayHello.ps1をカレントディレクトリに作成して実行するとき、コマンドプロンプトからは以下のように実行します。

powershell  -Command  .\SayHello

コマンドプロンプトから SayHello.ps1 を実行。

※ スクリプトが環境変数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コマンドレットやスクリプトを起動できます。

デスクトップにショートカットを作成し、「項目の場所」に入力。