本文を読み飛ばす

PowerShell のメモ

はじめに

PowerShell の使い方に関する、自分用の備忘録を残しておく。 随時更新。

パイプラインを流れるのは文字列ではなくオブジェクト

Unix 系のシェルでは文字列データをパイプに流して処理するのに対して、 PowerShell では .NET のオブジェクトを流して処理する。 コマンドの結果表示が画面に収まらないので絞り込みたいと思ったとき、 Unix 系シェルならば「先頭 n 行目」とか「文字列 x を含む行だけ」 といった考え方で処理するけれど、 PowerShell ならば「先頭 n 個のオブジェクト」や「プロパティ p (の文字列表現)に x が含まれるオブジェクト」といった考え方で処理することになる。

基本操作

概要

以下 2 モジュールに属するコマンドレットで、一般的な CUI 操作は可能だと思う。

表示形式の指定

Format- で始まる名前のコマンドレットが使える。

  • Format-Wide: 一覧形式。オブジェクトのもっとも代表的なプロパティの値だけを表示する。
    PS> Get-ChildItem | Format-Table
    
    
        ディレクトリ: C:\Users\sgryjp\src\sgryjp.gitlab.io
    
    
    .git                                                             .vscode
    cache                                                            files
    output                                                           pages
    posts                                                            themes
    __pycache__                                                      .doit.db.bak
    .doit.db.dat                                                     .doit.db.dir
    .gitignore                                                       .gitlab-ci.yml
    .markdownlint.json                                               conf.py
    requirements.txt
    
  • Format-Table: 表形式。1 行が 1 オブジェクトに相当する表状の表示となる。
    PS> Get-ChildItem | Format-Table
    
    
        ディレクトリ: C:\Users\sgryjp\src\sgryjp.gitlab.io
    
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    d-----        2021-01-09     14:32                .git
    d-----        2021-01-05     20:53                .vscode
    d-----        2021-01-09     14:13                cache
    d-----        2020-10-11     13:54                files
    d-----        2021-01-09     14:13                output
    d-----        2021-01-09     12:52                pages
    d-----        2021-01-05     23:32                posts
    d-----        2020-10-21     12:52                themes
    d-----        2021-01-09     14:28                __pycache__
    -a----        2021-01-09     18:34          10145 .doit.db.bak
    -a----        2021-01-09     18:34         357128 .doit.db.dat
    -a----        2021-01-09     18:34          10145 .doit.db.dir
    -a----        2021-01-04     15:57             55 .gitignore
    -a----        2021-01-04     15:57            329 .gitlab-ci.yml
    -a----        2021-01-04     15:57             52 .markdownlint.json
    -a----        2021-01-09     14:28          57743 conf.py
    -a----        2021-01-09     14:15             81 requirements.txt
    
  • Format-List: 詳細表示。オブジェクトごとに、各プロパティの値を表示するような表示となる。
    PS> Get-ChildItem | Format-Table
    
    
        ディレクトリ: C:\Users\sgryjp\src\sgryjp.gitlab.io
    
    
    Name           : .git
    CreationTime   : 2021-01-05 20:51:39
    LastWriteTime  : 2021-01-09 14:32:20
    LastAccessTime : 2021-01-09 18:34:13
    Mode           : d-----
    LinkType       :
    Target         : {}
    
    Name           : .vscode
    CreationTime   : 2021-01-05 20:53:49
    LastWriteTime  : 2021-01-05 20:53:49
    LastAccessTime : 2021-01-09 18:34:15
    Mode           : d-----
    LinkType       :
    Target         : {}
    
    【中略】
    
    Name           : requirements.txt
    Length         : 81
    CreationTime   : 2021-01-05 20:51:39
    LastWriteTime  : 2021-01-09 14:15:07
    LastAccessTime : 2021-01-09 14:15:07
    Mode           : -a----
    LinkType       :
    Target         : {}
    VersionInfo    : File:             C:\Users\sgryjp\src\sgryjp.gitlab.io\requirements.txt
                     InternalName:
                     OriginalFilename:
                     FileVersion:
                     FileDescription:
                     Product:
                     ProductVersion:
                     Debug:            False
                     Patched:          False
                     PreRelease:       False
                     PrivateBuild:     False
                     SpecialBuild:     False
                     Language:
    

表示対象の絞り込み

パイプラインを流れるオブジェクトの種類を変えたくない場合、-Object で終わる名前のコマンドレットが使える。

  • Select-Object: 先頭 n 個、末尾 n 個、あるいは重複除去、といった絞り込みを行える。
    PS> # 起動中のプロセス名のうち、重複を除いた最初の 10 個を表示
    PS> Get-Process | Select-Object -Unique | Select-Object -First 10
    
    Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
    -------  ------    -----      -----     ------     --  -- -----------
        217      18     3296      12440       0.75   9044   3 AppleMobileDeviceProcess
        621      36    22616      45360       3.34   7268   3 ApplicationFrameHost
        123       8     1572       5820              4804   0 armsvc
    
  • Where-Object: プロパティの内容に応じた絞り込みを行える。
    PS> # インストールされているアプリのうち「PowerShell」で名前が始まるものをリストアップ
    PS> Get-Package | Where-Object {$_.Name -like "PowerShell*"}
    
    Name                           Version          Source                           ProviderName
    ----                           -------          ------                           ------------
    PowerShell 7-x64               7.1.0.0                                           msi
    

その他

コマンドレットの検索

  • Get-Command (gcm) コマンドレットで、インストールされており使用可能なコマンドレットを検索できる。
    PS> # hash という文字列を含むコマンドレットを検索
    PS> Get-Command | Where-Object {$_.Name -like "*hash*"}
    
    
    Count    : 24
    Average  :
    Sum      : 110610
    Maximum  :
    Minimum  :
    Property : Length
    

基本統計量の計算

  • Measure-Object コマンドレットで基本統計量を計算できる。 対応している統計量は、総数、総和、平均、標準偏差、最小値、最大値の 6 つ。
    PS> # カレントディレクトリ以下にある Markdown ファイルの合計サイズを求める
    PS> Get-ChildItem -Recurse *.md | Measure-Object -Property Length -Sum
    
    
    Count    : 24
    Average  :
    Sum      : 110610
    Maximum  :
    Minimum  :
    Property : Length
    

ハッシュ値の計算

  • Get-Hash コマンドレットで基本統計量を計算できる。 対応している統計量は、総数、総和、平均、標準偏差、最小値、最大値の 6 つ。
    PS> # カレントディレクトリ以下にある Markdown ファイルの合計サイズを求める
    PS> Get-ChildItem -Recurse *.md | Measure-Object -Property Length -Sum
    
    
    Count    : 24
    Average  :
    Sum      : 110610
    Maximum  :
    Minimum  :
    Property : Length
    

Unix コマンドとの比較

Unix コマンド PowerShell コマンドプロンプト
tee Tee-Object N/A
N/A1 Set-Clipboard clip.exe

  1. macOS ならば pbcopy コマンドが使える