Install-Software "pwsh-sketches"
自家製スクリプト"pwsh-sketches"をGitHub経由でインストール。
はじめに
日常のシェル操作を少しだけ便利にしたり、ちょっとしたアイディアを形にするための私の自家製スクリプトセット:"pwsh-sketches “をインストールする。同スクリプトセットはGitHub 上に設置しており、そこからバージョン管理システム「Git 」を用いてPCにインストールする。
Key point: シェルの面白い点のひとつは、自分の作業やレベルに合った便利ツールを簡単に工作(クラフト)できるところ。
免責事項
“pwsh-sketches “は、プロトタイピングやアイデア探求のための実験的なPowerShellスクリプトセット。それらスクリプトは筆者が実際に動作確認したものではあるが、本番での使用を意図したものではなく、不安定であったり、不完全であったりする点に注意する。
ライセンス(著作権について)
pwsh-sketches
はMITライセンス
のもと、GitHub
上で公開している。当ライセンスのもと、自由に改変して使ってよい。改変したものを公開する場合、著作権表示(たとえばCopyright <初回バージョンの公開年> <著作権者の名前>
)をソースコードの先頭やプロジェクトのReadme.md
に記載する:
pwsh-sketches: Copyright 2025 btklab under The MIT License
- The MIT License: https://opensource.org/license/mit
- btklab/pwsh-sketches: https://github.com/btklab/pwsh-sketches
前提条件
- ✓ PowerShellのインストール
- ✓ Gitのインストール
- ✓ (Optional) 作成:作業ディレクトリ
- ✓ (Optional) 学習:PowerShellの基礎
- ✓ 検証した環境はこちら
リポジトリのクローン
- PowerShellを起動する
- スクリプトを置くディレクトリを作り移動する
- 例: 作業ディレクトリの作成
で作成した
bin
ディレクトリmkdir ~/cms/bin
pushd ~/cms/bin
- 例: 作業ディレクトリの作成
で作成した
- GitHubからスクリプトをクローンする
- 例:
git clone https://github.com/btklab/pwsh-sketches.git
- 例:
- インストール完了
↓ インストール後のディレクトリ構造(例)
home
└─cms
├─bin
│ └─pwsh-sketches <-- GitHubからクローンしたリポジトリ>
│
└─drafts
インストール:最小
Key point: 最小インストールすれば、好きな関数だけを(ドットソースで)読み込むことができる。
クローンしたリポジトリに移動してファイルとフォルダが格納されていることを確認する。
まずクローンしたリポジトリに移動する。cd
かpushd
コマンドを使う:
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"で想定する作業ディレクトリdrafts
とpwsh-sketches
の位置関係を以下に示す。余談だが、相対パスにおける../
は「今いる場所からひとつ上の階層のディレクトリ」(親ディレクトリ)を意味する。そして、../../
は、「今いる場所からふたつ上の階層のディレクトリ」である。
- from 作成:作業ディレクトリ
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"で想定する作業ディレクトリdrafts
とpwsh-sketches
の位置関係を以下に示す。また、これも前に書いたが、相対パスにおける../
は「今いる場所からひとつ上の階層のディレクトリ」(親ディレクトリ)を意味し、../../
は、「今いる場所からふたつ上の階層のディレクトリ」を意味するのだった。
- from 作成:作業ディレクトリ
home
└─cms
├─bin
│ └─pwsh-sketches <-- Repository cloned from GitHub
│ └─operator.ps1
│
└─drafts <-- Working directory
└─here_you_are
Note:pwsh-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
パラメータを指定する。