1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PowerShell】自作コマンドレットの読み込み方

Posted at

環境

Name                           Value
----                           -----
PSVersion                      7.0.3
PSEdition                      Core
GitCommitId                    7.0.3
OS                             Microsoft Windows 10.0.18362
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

方法1: $Profile に追記する

$ProfileC:\Users\USERNAME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1)に書かれた内容は起動時に読みこまれてセッション内で使用できるようになります。

ここに書かれた変数はスコープ的には最上位の global になるので気をつける必要がありますね。

外部モジュールの読み込みやエイリアスの登録だとかの簡単な設定であればこの方式が楽です。

方法2:$Profile からドットソースで読み込む

PowerShell では . に半角空けて .ps1 ファイルのパスを指定すると中身が現在のセッションに展開されます。このドットソース機能を使うと用途別にファイルを分けてカスタマイズできるようになるので、自作コマンドレットが増えたときに上記の方法1よりも管理がしやすくなるというメリットがあります。

今のところ、 $Profile と同じ階層の cmdlets というディレクトリに自作コマンドレットを置いていくという運用がしっくり来ています。

コマンドレットの読み込みには以下の内容を $Profile に書いておきます。

Microsoft.PowerShell_profile.ps1
$Profile | Split-Path -Parent | Join-Path -ChildPath "cmdlets" | Get-ChildItem -Recurse -Include "*.ps1" | ForEach-Object {
    . $_.FullName
}

動作的には読み込み先の .ps1 ファイルがそのまま $Profile 内に展開されるようです。 PowerShell 3 以前から使える $myInvocation は、読み込み先のファイルに書かれていても実際の実行場面では $Profile と同じディレクトリを指すようになるので注意が必要です。
(PowerShell 3 以降で導入された $PSCommandPath なら正しくファイル名を返すようです)

モジュールとして読み込む方法もありますが、 Modules ディレクトリは公式から取得したモジュールのために充てたいのと、.psd1 や .psm1 の扱いが手に余るのでこの方式です。
他に便利な方法がありましたらご指示いただければ幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?