Install-Software "pwsh-sketches"

自家製スクリプト"pwsh-sketches"をGitHub経由でインストール。

目次

はじめに

fig. Pwsh as a Craft.

日常のシェル操作を少しだけ便利にしたり、ちょっとしたアイディアを形にするための私の自家製スクリプトセット:"pwsh-sketches “をインストールする。同スクリプトセットはGitHub 上に設置しており、そこからバージョン管理システム「Git 」を用いてPCにインストールする。

Key point: シェルの面白い点のひとつは、自分の作業やレベルに合った便利ツールを簡単に工作(クラフト)できるところ。

免責事項

pwsh-sketches “は、プロトタイピングやアイデア探求のための実験的なPowerShellスクリプトセット。それらスクリプトは筆者が実際に動作確認したものではあるが、本番での使用を意図したものではなく、不安定であったり、不完全であったりする点に注意する。

ライセンス(著作権について)

pwsh-sketchesMITライセンス のもと、GitHub 上で公開している。当ライセンスのもと、自由に改変して使ってよい。改変したものを公開する場合、著作権表示(たとえばCopyright <初回バージョンの公開年> <著作権者の名前>)をソースコードの先頭やプロジェクトのReadme.mdに記載する:

pwsh-sketches: Copyright 2025 btklab under The MIT License

-- The MIT Licenseの著作権表示例

前提条件

リポジトリのクローン

  1. PowerShellを起動する
  2. スクリプトを置くディレクトリを作り移動する
  3. GitHubからスクリプトをクローンする
    • 例:
      • git clone https://github.com/btklab/pwsh-sketches.git
  4. インストール完了

↓ インストール後のディレクトリ構造(例)

home
└─cms
  ├─bin
  │  └─pwsh-sketches  <-- GitHubからクローンしたリポジトリ>
  └─drafts

インストール:最小

Key point: 最小インストールすれば、好きな関数だけを(ドットソースで)読み込むことができる。

クローンしたリポジトリに移動してファイルとフォルダが格納されていることを確認する。 まずクローンしたリポジトリに移動する。cdpushdコマンドを使う:

pushd ~/cms/bin/pwsh-sketches

ちなみにパスの入力はTAB補完を使うと素早く正確に行える。 複数候補がある場合はTAB, TAB, …で候補が順次表示される:

  • ~/cm<TAB>、で~/cms/と入力され、
  • ~/cms/bi<TAB>、で~/cms/bin/と入力され、
  • ~/cms/bin/pw<TAB>を押すと残りが補完される

次に、lsコマンドでリポジトリのファイルやフォルダが正しくクローンされているかをみる:

## at ~/cms/bin/pwsh-sketches
ls

出力:

    Directory: C:/Users/btklab/cms/bin/pwsh-sketches

Mode         LastWriteTime  Length Name
----         -------------  ------ ----
d-r--  2024/04/27    10:00         .github
d-r--  2024/10/31    14:43         examples
d-r--  2024/04/27    10:00         img
d-r--  2025/03/02    22:31         src
d-r--  2024/04/27    10:00         tests
-a---  2023/10/18     6:57     107 .gitignore
-a---  2025/03/06     1:01    7595 CHANGELOG.md
-a---  2024/08/06    16:54     106 examples.md
-a---  2023/01/04    11:50    1084 LICENSE
-a---  2023/12/05     7:39    2357 operator-extra.ps1
-a---  2025/02/15    10:33     378 operator-minimum.ps1
-a---  2025/03/02    22:49    7580 operator.ps1
-a---  2025/03/02    22:50  387678 README.md

もとのディレクトリに戻る

popd

ためしにひとつコマンドを実行してみる。 その前に注意点:

  • pwsh-sketchesは基本的に1ファイル1関数の集合体である
    • PowerShellのモジュールではない
    • 他の関数と依存関係にある関数もいくつか存在する
  • pwsh-sketchesの読み込みはドットソースを用いてスクリプトファイルを直接指定する
    • たとえば、. operator.ps1などとする
    • Import-Moduleコマンドは用いない
  • ウィンドウを閉じると読み込んだ関数は初期化される
    • PowerShellを起動するたびに関数の再読み込みが必要
    • この作業が面倒な場合は、スクリプトをプロファイルに追加して自動読み込みする、モジュール化するなどの方法がある

ではまず、文字コードをUTF-8に変更する:

  • この操作はPowerShell 6以降は不要(デフォルト値がすでにUTF-8)であるとは思う
  • 私はPowerShellを他のプログラミング言語とのグルー言語(糊付け言語)として用いているので、どの文字コードを使うかは使用する言語すべてで明示して統一するようにしているだけ
  • ただし、もしあなたが使用しているPowerShellがWindows PowerShell (PowerShell 5)の場合、この操作は必要
# リポジトリに移動する
pushd ~/cms/bin/pwsh-sketches

# 文字コードをUTF-8に変更するソースをドットで読み込む
. ./operator-minimum.ps1

operator-minimum.ps1の中身は以下のとおり:

# for windows only
if ($IsWindows){
    ## set encode to utf8
    chcp 65001
    #$OutputEncoding = [System.Text.Encoding]::UTF8
    [System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
    [System.Console]::InputEncoding  = [System.Text.Encoding]::GetEncoding("utf-8")
    # compartible with multi byte code
    $env:LESSCHARSET = "utf-8"
}

次に、利用する関数ファイルを、ドットソースで読み込む:

  • 「ドットソースで読み込む」とは、ドット(.)と空白の後にファイル名を指定する方法のこと
  • これにより関数ファイルの中身を現在のセッション(現在のスコープ)でのみ使用できるようになる
  • 「現在のセッションのみで使用できる」の意味は、現在のセッションから抜け出る(≒exitで抜ける、別の新しいセッションをはじめる、など)までは使用できる、という意味
  • 永続的ではなく一時的な読み込み
  • この方法は、毎回PowerShellを起動するたびに必要な関数をドットソースで読み込まねばならない、と考えた場合は面倒であるといえる
  • 一方、Windowを閉じれば読み込みはクリアされる、と考えた場合は、不要な関数が溜まってきて動作が遅くなるという状態を制御できる、ともいえる

試しにやってみよう。以下は、grep というコマンドをドットソースで読み込む例:

## Case.1 pwsh-sketchesのルートディレクトリから実行する場合
## 注意:ファイル名の前にドット(.)と空白がある!

## at ~/cms/bin/pwsh-sketches
. ./src/grep_function.ps1
## Case.2 他のディレクトリから実行する場合
## 注意:ファイル名の前にドット(.)と空白がある!

## at ~
. ~/cms/bin/pwsh-sketches/src/grep_function.ps1
## Case.3 作業ディレクトリ"drafts"から実行する場合
## 相対パスで指定する

## at ~/cms/drafts
. ../bin/pwsh-sketches/src/grep_function.ps1

Note:“Case.3"で想定する作業ディレクトリdraftspwsh-sketchesの位置関係を以下に示す。余談だが、相対パスにおける../は「今いる場所からひとつ上の階層のディレクトリ」(親ディレクトリ)を意味する。そして、../../は、「今いる場所からふたつ上の階層のディレクトリ」である。

home
└─cms
  ├─bin
  │  └─pwsh-sketches <-- Repository cloned from GitHub
  │     └─src
  │        └─grep_function.ps1
  └─drafts <-- Working directory
     └─here_you_are

grepコマンドは、パイプラインを通ってきた「テキスト」(テキストオブジェクト)の各行に対して、指定したパターン(正規表現)にマッチする行のみを返すフィルタコマンド。簡単にいうと、grepは「テキストの中から特定の文字列を検索する」コマンドである。

早速使ってみよう。まずgrepコマンドへの入力として、22から26までの数字を列挙する(参考:Microsoft.Learn – 範囲演算子 .. from about_Operators ):

22..26

出力:

22
23
24
25
26

この出力をパイプライン(|)を用いてgrepコマンドに渡す:

22..26 | grep 3

出力。3を含む行のみが出力される:

23

Key point: pwsh-sketchesにおけるgrep関数は、PowerShellコマンドレット”Select-String “のラッパーコマンド。オプションの挙動はLinuxにおける”grep “コマンドを元にしたもの。

なお、grepコマンドのヘルプは以下のように取得する:

Get-Help grep

Get-Help コマンドの別名manを用いてもよい:

man grep

インストール:一括

Key point: 一括インストールすれば、すべての関数をいちどに読み込める。個別の関数名を意識する必要はなくなるが、最小インストールよりも読み込みに時間がかかる。

pwsh-sketchesの関数ファイルは、前セクションのようにひとつずつ読み込んでもよいが、一度にぜんぶ読み込むこともできる。以下は、pwsh-sketchesの関数ファイルをリポジトリのルートにあるoperator.ps1を用いて一度に読み込む例である。このケースも、読み込んだ関数群は現在のセッションを閉じる(=ウィンドウを閉じる、exitコマンドを実行する、新規のセッションを開始する)などで初期化される。

## Case.1 pwsh-sketchesのルートディレクトリから実行する場合
## 注意:ファイル名の前にドット(.)と空白がある!

## at ~/cms/bin/pwsh-sketches
. ./operator.ps1
## Case.2 他のディレクトリから実行する場合
## 注意:ファイル名の前にドット(.)と空白がある!

## at ~
. ~/cms/bin/pwsh-sketches/operator.ps1
## Case.3 作業ディレクトリ"drafts"から実行する場合
## 相対パスで指定する

## at ~/cms/drafts
. ../bin/pwsh-sketches/operator.ps1

Note:一度書いたが、改めて"Case.3"で想定する作業ディレクトリdraftspwsh-sketchesの位置関係を以下に示す。また、これも前に書いたが、相対パスにおける../は「今いる場所からひとつ上の階層のディレクトリ」(親ディレクトリ)を意味し、../../は、「今いる場所からふたつ上の階層のディレクトリ」を意味するのだった。

home
└─cms
  ├─bin
  │  └─pwsh-sketches  <-- Repository cloned from GitHub
  │     └─operator.ps1
  └─drafts <-- Working directory
     └─here_you_are

Notepwsh-sketchesの関数の中には別名(エイリアス)が設定されているものもある。operator.ps1を読み込むと、そのエイリアスも同時に読み込まれるのだが、もしすでに同名のエイリアスが存在している場合、operator.ps1の読み込み途中にエラーメッセージが表示される。その場合は、pwsh-sketchesの関数ファイルを特定しエイリアスの名前を変更するか、エイリアスを削除するなどの対応が必要である。

pwsh-sketchesのインストールを確認する。pwsh-sketchesで読み込んだ関数をリストアップするコマンドman2を実行してみる:

man2

出力:

Add-ForEach              Get-Last              Unique-Object  getfirst    pwsync
Add-ID                   Get-OGP               Unzip-Archive  getlast     retu
Add-LineBreakEndOfFile   Get-Ticket            addb           grep        rev2
Add-LineBreak            GetValueFrom-Key      addl           gyo         rev
Add-Quartile             Grep-Block            addr           han         say
Add-Stats                GroupBy-Object        addt           head        sed-i
Apply-Function           Inkscape-Converter    cat2           image2md    sed
Auto-Clip                Invoke-Link           catcsv         jl          self
Cast-Date                Join-Line2            chead          json2txt    seq2pu
Cast-Decimal             Join2-Object          clip2file      juni        sleepy
Cast-Double              Measure-Quartile      clip2hyperlink keta        sm2
Cast-Integer             Measure-Stats         clip2img       kinsoku     summary
ClipImageFrom-File       Measure-Summary       clip2normalize lcalc2      table2md
ConvImage                Override-Yaml         clip2push      lcalc       tac
Decode-Uri               Plot-BarChart         clip2shortcut  linkcheck   tail-f
Decrease-Indent          PullOut-String        conv           linkextract tail
Delete-Field             Rename-Normalize      count          list2table  tarr
Detect-XrsAnomaly        Replace-ForEach       csv2sqlite     logi2dot    tateyoko
Drop-NA                  Replace-NA            csv2txt        logi2pu     teatimer
Edit-Function            Select-Field          ctail2         man2        tenki
Edit-Property            Set-DotEnv            ctail          map2        tex2pdf
Encode-Uri               Set-Lang              decil          math2tex    toml2psobject
Execute-Lang             Set-NowTime2Clipboard delf           mdfocus     uniq
Execute-RMarkdown        Shorten-PropertyName  dot2gviz       mdgrep      vbStrConv
Execute-TinyTex          Shutdown-ComputerAFM  filehame       mind2dot    watercss
ForEach-Block            Sleep-ComputerAFM     fillretu       mind2pu     wrap
ForEach-Step             Sleep-Computer        flat           movw        yarr
Get-AppShortcut          Sort-Block            flow2pu        pawk        ycalc
Get-ClipboardAlternative Tee-Clip              fpath          percentile  ysort
Get-DateAlternative      Test-isAsciiLine      fval           pu2java     zen
Get-First                Transpose-Property    fwatch         push2loc
Get-Histogram            Trim-EmptyLine        gantt2pu       pwmake

用語

pwsh-sketches

日常のシェル操作を少しだけ便利にしたり、ちょっとしたアイディアを形にするための自家製スクリプトセット。GitHub に置いて公開している。使用に際しての注意点は、このリポジトリにおいてあるソースコードは、ソースコードの見本としてではなく、コマンド実装のいちアイディアとして見てほしい、という点。このスクリプトセットはぼくがアイディアを具現化して自分で使うために「できるだけ素早く試作品として」実装したものだ。コードは保守管理しにくく、バグも多分に含んでいるということを念頭において利用してほしい。

Myは日本語で「個人的な・私的な」(こじんてきな・してきな)という。この記事では「自家製の」(じかせいの)あるいは「自家醸造の」(じかじょうぞうの)という意味で用いている。pwsh-sketchesはつまり「自分で使うために自分でつくったスクリプトセット」という意味だ。

grep – pwsh-sketches

pwsh-sketches に同梱されている文字列検索用のフィルタコマンド(関数)。

パイプラインを通ってきた「テキスト」(テキストオブジェクト)の各行に対して、指定した文字列を含む行のみを返す。

実装はSelect-String のラッパースクリプト。

指定する文字列は単純な文字列ではなく、正規表現 である点に注意する。いくつかの記号、たとえば.*+?^$[]{}()|\、などは正規表現のメタ文字として特別な意味を持つ。

正規表現ではなく単純な文字列で検索したい場合は、-SimpleMatchパラメータを指定する。