タスクスケジューラからスクリプトをキック → スクリプトから相対パスで別スクリプトを指定してキック… 等のシチュで必要になるアレです。
コマンドプロンプト
@echo off
@rem 実行時に指定された絶対/相対パスそのまま
echo %0
@rem スクリプトのフルパス
echo %~f0
echo %~dpnx0
@rem スクリプトのディレクトリ
echo %~dp0
実行確認(例)
C:\Users\heignamerican\testroom\cmd>hoge.bat
hoge.bat
C:\Users\heignamerican\testroom\cmd\hoge.bat
C:\Users\heignamerican\testroom\cmd\hoge.bat
C:\Users\heignamerican\testroom\cmd\
C:\Users\heignamerican\testroom\cmd>.\hoge.bat
.\hoge.bat
C:\Users\heignamerican\testroom\cmd\hoge.bat
C:\Users\heignamerican\testroom\cmd\hoge.bat
C:\Users\heignamerican\testroom\cmd\
C:\Users\heignamerican\testroom\cmd>cd ..
C:\Users\heignamerican>cmd\hoge.bat
cmd\hoge.bat
C:\Users\heignamerican\testroom\cmd\hoge.bat
C:\Users\heignamerican\testroom\cmd\hoge.bat
C:\Users\heignamerican\testroom\cmd\
PowerShell
$scriptPath = $MyInvocation.MyCommand.Path
echo $scriptPath
Split-Path -Parent $scriptPath
実行確認(例)
普通に実行する場合
C:\Users\heignamerican\testroom\ps> .\hoge.ps1
C:\Users\heignamerican\testroom\ps\hoge.ps1
C:\Users\heignamerican\testroom\ps
C:\Users\heignamerican\testroom\ps> cd ..
C:\Users\heignamerican\testroom> .\ps\hoge.ps1
C:\Users\heignamerican\testroom\ps\hoge.ps1
C:\Users\heignamerican\testroom\ps
ドットソース形式での読み込み
C:\Users\heignamerican\testroom\ps> . .\hoge.ps1
C:\Users\heignamerican\testroom\ps\hoge.ps1
C:\Users\heignamerican\testroom\ps
C:\Users\heignamerican\testroom> . .\ps\hoge.ps1
C:\Users\heignamerican\testroom\ps\hoge.ps1
C:\Users\heignamerican\testroom\ps
PowerShell 補足
-
> hoge.ps1
と指定してはダメ。> .\hoge.ps1
とカレントディレクトリの相対パスを明記する
別ディレクトリであれば> ps\hoge.ps1
は通る -
.
コマンドによる ドットソース形式での読み込み を考慮
所感という名の愚痴
いつも思うんですが、コマンドプロンプトの方は自明な命名ではないですが
その分ワンライナー的な扱いは簡単ですね。
PowerShell はスクリプトゴリゴリ書く場合はいいけど、コマンドラインからワンライナーを駆使した作業とかに向かない…
alias を頑張って設定するとかでちょっとは便利になるのだろうか。