スポンサーサイト  このエントリーを含むはてなブックマーク はてなブックマーク - スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Windows PowerShell を使ってみました2  このエントリーを含むはてなブックマーク はてなブックマーク - Windows PowerShell を使ってみました2

昨日のエントリーにウソがありました。

現状のコマンドプロンプトとは微妙に互換性がありません。例えばCドライブをカレントにしているときに cd D:\subdir とすると、コマンドプロンプトならDドライブのカレントディレクトリが変更されるだけですが、PowerShellだとカレントドライブも同時に移動します。カレントドライブの移動には、コマンドプロンプトならD:などとしますが、PowerShwllではエラーになります。

取り消し線部分が全部ウソです。D:でもエラーになりません。しかし微妙な違いがあるのは確かです。上のcdの動作もそうですが、例えば、

PS C:\> Get-Service>c:\getservice.txt

これがエラーになります。どうも、

PS C:\> Get-Service >c:\getservice.txt

のように、Get-Service の後ろに空白が必要みたいです。パイプライン(|)の前後には必要ないようですが、|の後ろに空白が無いとTABキーによるコマンド補完が効きません。とりあえずリダイレクトやパイプの前後には空白をおいた方がよさそうです。見た目もきれいですしね。

気になったこと。

PS C:\> Get-Service > c:\getservice.txt

の出力結果は以下のようになります。リダイレクトせずに画面表示した場合もこれと同じ内容です。

Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  Alerter            Alerter                               
Running  ALG                Application Layer Gateway Service     
Stopped  AppMgmt            Application Management                

これに対して、

PS C:\> Get-Service | Export-Csv c:\getservice.csv -encoding Default

の出力結果は以下のようになります。横長でみにくいですが。

#TYPE System.ServiceProcess.ServiceController
Name,CanPauseAndContinue,CanShutdown,CanStop,DisplayName,DependentServices,MachineName,ServiceName,ServicesDependedOn,ServiceHandle,Status,ServiceType,Site,Container
Alerter,False,False,False,Alerter,System.ServiceProcess.ServiceController[],.,Alerter,System.ServiceProcess.ServiceController[],SafeServiceHandle,Stopped,Win32ShareProcess,,
ALG,False,False,True,"Application Layer Gateway Service",System.ServiceProcess.ServiceController[],.,ALG,System.ServiceProcess.ServiceController[],SafeServiceHandle,Running,Win32OwnProcess,,
AppMgmt,False,False,False,"Application Management",System.ServiceProcess.ServiceController[],.,AppMgmt,System.ServiceProcess.ServiceController[],SafeServiceHandle,Stopped,Win32ShareProcess,,

この違い、コマンドプロンプトの感覚だと戸惑います。リダイレクトで渡されるのは今まで通り標準出力ですが、パイプで渡されるのは標準出力ではなく、内部的なオブジェクトなんですね。Get-Service | Get-Member を実行すると、Get-Service が返すオブジェクトのメンバーを見ることが出来ます。Export-Csvで出力されるのは、その中のMemberTypeがPropertyのものだと分かります。

コマンドを実行して画面に表示される結果からパイプされる内容を知るというのは、コマンドプロンプトではごく普通の感覚でした。これからコマンドラインに触れていく人はともかく、コマンドプロンプトやUnix系コマンドライン慣れている人にとっては強制脳内パラダイムシフトが必要そうです。

コメント

コメントの投稿















管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://srgia.blog46.fc2.com/tb.php/163-710addbd

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。