スクリプトが長くなってくると、いくつかのファイルに分割したい。
モジュールという仕組みもありますが、スクリプトを再利用する予定が無い場合、ドットソース形式でスクリプトを読み込むことになります。
参照元から参照先のスクリプトのパスを指定する場合、相対パスで指定すると何かと都合が良いのですが、実行している環境によってスクリプトが読み込めない場合がありました。原因を調べるのが面倒なので絶対パスで記述して放置していたのですが、思い立って調べてみました。
「どこ」から見た相対パスなのかの認識が間違っていたことが原因でした。
この「どこ」を私はドットソース形式で読み込んでいる参照元のスクリプトから見た相対位置だと思いこんでいましたが、どうやらスクリプトを実行しているカレントディレクトリから見た相対位置を記述する必要があるようです。
シェルスクリプトだからと思えばそういう物なのかもしれませんが、なんだかもやもやします。
それはさておき相対パスに対応したドットソース形式の読み込みのスクリプトを作ってみます。
main.ps1
$current_dir = (Convert-Path .) # 現在のディレクトリを変数に一時保存
Set-Location -LiteralPath $PSScriptRoot # スクリプトの保存ディレクトリに移動
. ".\sub\func.ps1" # ドットソース形式で読み込み
Set-Location -LiteralPath $current_dir # カレントディレクトリを一時保存したディレクトリに戻す
Foo # func.ps1内に定義した関数の呼び出し。
func.ps1
function Foo
{
Write-Host "Bar"
}
以下のようにスクリプトを配置
.\main.ps1
.\sub\func.ps1
これでカレントディレクトリがどこからでもmain.ps1をする事が出来るようになりました。
Set-Locationを初めて使ったかもしれません、Cange-Directoryでは無いあたりがこだわりを感じるコマンドレット名ですね。AliasはCDみたいですが。
コメント
[…] PowerShell で相対パスで指定したスクリプトをドットソース形式で読み込む |… […]