業務ではアプリ開発やコンテナ利用のためLinuxでbashを使っているのですが、自宅のWindowsでも一部シェルで作業したくなり、せっかくなのでPowerShellを使ってみることにしました。
Linuxでは、コマンドに -h
オプションを付けたり man
コマンドを使うことで、その場でコマンドの使い方を調べられます。PowerShellでもその場で使い方がわかると楽だと思い、まずは調べ方を探ることにしました。実際に試行錯誤してわかった「調べ方」をまとめます。
- コマンドの検索
- ヘルプの閲覧
- 変数の確認
- オブジェクトの調査
- 型の調査
記載したコマンドは、以下の環境で動作確認しています。
PowerShellバージョン | OS |
---|---|
5.1.19041.610 | Windows 10 |
7.0.3 | Ubuntu 18.04 (Dockerコンテナ) |
調べるためのコマンドまとめ
コマンドの検索
PowerShellのコマンド(特にコマンドレット)は命名が <動詞>-<名詞>
と統一的なので、名前を見れば機能の見当がつきます。なので、コマンド一覧を出せれば困ったときの手掛かりになります。
Get-Command Get-*
Get-Command -V *move* -No *item*
Get-Command -C Application # パスの通っている実行可能ファイル
Get-Command g* -C Alias
Get-Alias g*
Get-Alias -D Get-*
ちなみにbashのように alias
と打っても動作しますが、これはコマンドとしては存在しません。PowerShellは「見つからなかったコマンドは Get-
を付けてリトライする」らしいです。
ヘルプの閲覧
使えそうなコマンドが見つかったら、使い方の詳細はヘルプを見ればいいです。パラメータ、入出力の型、使用例など様々な情報があります。
また、各コマンドの使い方だけでなく、PowerShellの基礎について説明したものもあります。
※ コンピュータにヘルプファイルが入っていない場合は十分な情報を得られません。管理者権限で Update-Help
コマンドを実行しておく必要があります。
-h
相当)Get-Location -?
Get-Help Get-Location -Full | more # Linuxなら `less` も可
help Get-Location # help は内容を自動的にページング
※ Windows PowerShell 5.1 では、 help
コマンドでも -Full
を付ける必要がありました。
help *operator*
help *output* -Ca HelpFile
変数の確認
変数はユーザ自身で定義できるほか、あらかじめ用意されているものもあります。
変数は先頭に $
を付けて使うのが簡単です。また、 Variable:
や Env:
といった特殊なドライブ1を用いると、ファイルのように扱うこともできます。
Get-Variable
Get-Item Variable:*
Get-Item Env:*
$PSVersionTable
Get-Content Variable:PSVersionTable
$env:PATH # Linuxでは環境変数の大文字・小文字が区別される
Get-Content Env:PATH
オブジェクトの調査
PowerShellの特徴は、パイプや引数において文字列でなくオブジェクトで渡していることです。逆に言えば活用するためには、そのオブジェクトが何であるか、どんなメソッドやプロパティがあるか、などを把握する必要があります。
$obj = Get-ChildItem
$obj | Get-Member # 配列の場合は要素の種類毎
Get-Member -I $obj # 配列の場合は配列そのもの
$obj = Get-ChildItem
$obj.GetType()
$obj[0].GetType()
$obj = Get-Item ~
$obj.GetFiles # 括弧を付けずにメソッドを呼ぶ
応用:コマンドの情報
最初の Get-Command
はコマンド情報のオブジェクトを返すので、それを利用するとヘルプを表示せず一部の情報を抜き出せます。
$cmdlet = Get-Command Get-Item
$cmdlet.Definition # パラメータの構文
$cmdlet.OutputType # 出力としてあり得る型(ヘルプと違う?)
$cmdlet.Parameters
$alias = Get-Command gi
$alias.Definition # エイリアスだと構文を見れない
$alias.ResolvedCommand.Definition # 元のコマンドなら構文を見れる
$func = Get-Command help
$func.Definition # 関数定義(=スクリプト)を見れる
$func.Parameters
型の調査
オブジェクトがすぐ手に入らないときは、型から直接情報を得る方法があります。
[regex] | Get-Member Get*s
# リスト形式だと長いので、 Format-Table コマンドで表形式にしてプロパティも絞る
[regex].GetMembers() | ft Name, MemberType, ReturnType, Attributes
# 単純に Where-Object コマンドで条件指定する
[regex].GetMethods() | ? { ! $_.IsStatic } | ft Name, ReturnType, Attributes
調べてみて
じっくりヘルプを読むだけならインターネットのほうが良さそうですが、今回は調べるために手を動かし試行錯誤したことで、PowerShellの基本的な操作に慣れることができました。慣れてくると「こんなこともできるのでは?」と見当をつけられ、できることがどんどん増えていくのがその場でわかって楽しかったです。
PowerShellをbashの代替として見ていた頃は、文法が飲み込めず自力でスクリプトを組み立てることができませんでした。しかし、以下の2点に気付いたときから一気に見方が変わり、文法を理解できるようになりました。
- コマンドの結果は普通に変数に代入できる、逆に変数部をコマンドに置換もできる2
- 「コマンドの結果」でなく「単なるオブジェクト」をパイプで送り込める
コマンドをパイプで繋いでいるのは、一般的なオブジェクト指向プログラミングでメソッドを繋げるのと同じように見えます。メソッドの引数に丸括弧を使わなくていい言語はRubyなどいろいろあるので、それらから類推すれば文法は不思議には感じなくなりました。配列リテラルに括弧がいらないのは驚きましたが、コマンドのパラメータに渡す3ことを考えれば納得しました。
そんなわけで、当初の「Windowsでも一部シェルで作業」ができるようになり、GUIでは面倒だった単純作業などを少しずつ改善しています。WSLで済ませているものも多いですが。
参考
- 今回参照したもの
-
PowerShellのヘルプ(
Get-Help
コマンド) - Docker での PowerShell の使用 - PowerShell | Microsoft Docs
-
PowerShellのヘルプ(
- オンラインで調べるのに役立ちそうなもの