はじめに
Script内にScriptから見たフォルダやScriptの相対パスを定義したのに、正しく実行されない。。。
Scriptを呼び出す際、Scriptを呼び出す場所に関わらず内部で子Scriptを呼び出したい場合はどうすればいい?
という疑問を解消する為の処理について、紹介します。
対象ユースケース:
- Scriptを呼び出すカレントディレクトリに関わらない結果を担保する
- 親Scriptに子Scriptの相対パスを定義し、実行する
- Script内に相対パスを定義したフォルダに対して操作する
環境
Windows/Linuxの端末
Script内の記述
Windows の場合
Windows では Get-Location というモジュールがあります。
これは、現在のディレクトリを表すオブジェクトを取得します。
結果をアーカイブしておき、Set-Location というモジュールでScriptが配置されているディレクトリへ移動します。
# 現在のディレクトリの位置を記録
$LOCATION_ORG = Get-Location
# スクリプトの位置に移動
$SCRIPT_DIR = $PSScriptRoot
Set-Location $SCRIPT_DIR
このままScriptを終えると、Set-Location で移動した位置が最終的な作業ディレクトリとなってしまいます。
そこで、Get-Location で取得しておいた実行前の位置に戻る処理を実行します。
# PowerShell Script実行前の位置にディレクトリ移動
Set-Location $LOCATION_ORG
Linux の場合
Linuxの場合は簡素で、Script内で実行するパスに移動してもScript実行後はカレントディレクトリに変わりはありせん。
cd `dirname $0`
終わりに
スクリプトを呼ぶスクリプトを書くときにハマるところかな、と思います。
ご参考になれば幸いです。