コマンドプロンプトからWindows PowerShellを活用するあれこれ

Windows PowerShellは確かに良いツールだ。それは認めよう。しかしUIとしては未だにウィンドウを最大化できないのは正直問題じゃないかと思う*1

何よりコマンドプロンプト上で構築してきた既存の資産もある訳で、全面的にPowerShellに移行するよりも、既存の環境にPowerShellをプラスする方向で活用する方が個人的に望ましい。

前提条件

Windows XP上でPowerShell 2.0、という環境。

普通にコマンドプロンプトPowerShellを使う

PowerShellコマンドプロンプトから起動できる。

powershell

こうするとコマンドプロンプト内でPowerShellが起動し、入力待ちプロンプト状態になる。

D:\tmp>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS D:\tmp>

後はいつも通り使えばよい。入力補完も効く。

起動時のオプション等を調べたい場合は、

powershell -Help
powershell -?
powershell /?

これでヘルプが表示される。

ワンライナーする

「-Command」というパラメータを使えばコマンドプロンプト上からPowerShellワンライナーできる。

D:\tmp>powershell -Command 1 + 2  # comment
3

D:\tmp>powershell -Command "1 + 2"
3

D:\tmp>powershell -Command '1 + 2'
1 + 2

D:\tmp>powershell -Command for ($i = 0; $i -lt 5; $i++) {$i}
0
1
2
3
4

D:\tmp>

PowerShellスクリプトを実行する

「-File」というパラメータを使えばOK。

D:\tmp>type sample.ps1
for ($i = 0; $i -lt 5; $i++) {
    $i
}
exit 5

D:\tmp>powershell -File sample.ps1
0
1
2
3
4

D:\tmp>echo %ERRORLEVEL%
5

D:\tmp>

ネット上に「コマンドプロンプトにエラーコードを返すには一工夫必要」という情報があったが、とりあえず不要なようだ。-Fileを使っているからか、それともPowerShell 2.0で変わったのだろうか?

注意点として、実行ポリシーでスクリプトの実行が無効化されているとエラーになる。一時的にスクリプトを実行したい場合は「-ExecutionPolicy」を使えば良いようだ。

D:\tmp>powershell -Command Get-ExecutionPolicy
Restricted

D:\tmp>powershell -ExecutionPolicy RemoteSigned -File sample.ps1
0
1
2
3
4

D:\tmp>powershell -Command Get-ExecutionPolicy
Restricted

D:\tmp>

何となくセキュリティ的に問題になる可能性があるように感じる。Vista以降のUACがある環境では管理者権限でないとこの方法は使えないのかもしれないが、XPしか触っていないので真偽は不明だ。

*1:まあckwとか使えばよいのだけど、未だにデフォルトで対応していないというのもなあ。