Windows PowerShellの爪の先ほどをかじってみる

PowerShell

DOS 時代は否が応でも DOS のコマンドを使わざるを得なかったので、その時代に DOS に慣れ親しんでた人は Windows のコマンドプロンプトも違和感なく使えてたんだけど、時代が変わってコマンドプロンプト廃止とかいう話が出てるようでマジかよって感じ。
コマンドプロンプトはとんでもなく使い勝手は悪いけど簡単だったのに・・
で、コマンドプロンプトから PowerShell に変わったら何がどうなるかっていうと 一番の大きな変更は「黒い画面だったのが青い画面になる」「コマンドがコマンドレットになる」これだ。

しらじらしいが、ちょっと触ってみる。
ファイルリストを表示するなら、コマンドプロンプトでは dir だったけど PowerShell では dir でも ls でも gci でもいける。というか、 PowerShell の由緒正しい?コマンドレットは Get-ChildItem で dir と ls と gci はそのエイリアス。
だから Get-ChildItem は DOS やコマンドプロンプトの dir と同等なんだなと思ったらこれが大違い。 Get-ChildItem はかなりクセモノ。

たとえば、次のコマンドだと普通にファイルリストが取れる。("-Path" は無くても大丈夫)

PS C:\Users\foobar> gci -Path c:\windows

ファイル名に ".dll" を含むファイルのリストを取りたいと思ったら次のコマンド。これも当然ながら思ったとおりに動く。

PS C:\Users\foobar> gci -Path c:\windows -Include "*.dll"

"-Include" を使わずに同じ結果を得ようとする場合、Unix系のシェルだと ls | grep ".dll" みたいにするんだけど、 PowerShell には grep が無いので代わりに Select-String (sls) を使う。
同じくファイル名に ".dll" を含むファイルのリストを取りたいと思って下のようにする。

PS C:\Users\foobar> gci -Path c:\windows | sls .dll

普通に考えたらこれでいけそうなんだけど、出力は全く意図しないとんでもないことに、ファイルを cat したみたい、 PowerShell でいえば Get-Content したみたいになってしまう。

PS C:\Users\foobar> gci -Path c:\windows -Name | sls .dll

"-Name" を追加してファイル名に限定してやる。これなら意図してたとおりに動く。

PowerShell ではコマンドプロンプトと同じく ipconfig などのコマンドも使える。ipconfig は system32 下の ipconfig.exe が実体だからコマンドプロンプトが廃止されても PowerShell で使い続けられるよね?大丈夫だよね。これも一緒に廃止になると不便で困るよ。

PS C:\Users\foobar> ipconfig /all

これはコマンドプロンプトと同じ結果を得られる。

コマンドプロンプトでは find と組み合わせると該当する文字列を含む行だけを取得できる。

C:\Users\foobar> ipconfig /all | find "ゲートウェイ"

これだと、「デフォルト ゲートウェイ」の行だけを表示できる。
しかし、同じコマンドを PowerShell で実行するとエラー。

PS C:\Users\foobar> ipconfig /all | sls ゲートウェイ

のように find を使う代わりに Select-String (sls) を使えばいける。

ところで、コマンドの途中で無駄に日本語が混じるのは打ちにくい。そして PowerShell の画面で日本語を入力すると半角分くらいが崩れて腹立たしいことこの上ない。とくに PowerShell ではコマンドレットを組み合わせて1行に長く打つので文字崩れは響く。これは早めに直してくれないとどうにも困る。

PowerShell で日本語モードと英語モードを切り替えるのは DOS やコマンドプロンプトと同じく chcp 437 (英語モード)、 chcp 932 (日本語モード)。さらに UTF-8 モードに切り替えるのは chcp 65001 だが、 Windows ではコマンドプロンプトもそうだが何故か UTF-8 モードだと日本語入力させて貰えなくなる。それじゃ意味なくない?

と、いうことで、英語モードで先程同様にipconfigで「デフォルト ゲートウェイ」の行を表示するなら下。

PS C:\Users\foobar> chcp 437
画面が切り替わる
PS C:\Users\foobar> ipconfig /all | sls gateway

当然だが英語モードでは「デフォルトゲートウェイ」は "Default Gateway" と表示されるのでそれを期待して sls (grep) する文字列は gateway になる。日本語を入力しなくて済むので打ちやすい。
入力面では英語モードを標準にしたいくらいだけど、そうすると日本語メッセージは化けて表示されてしまうのでつらいなぁ。

関連記事: