バッチファイルとPSスクリプトのカレントディレクトリ
はじめに
表題の通り、初めてバッチファイルを作成した際にカレントディレクトリで困ったので、これからbatまたはps1を作成しようとしている人の助けになれば幸いです。
カレントディレクトリが異なる
管理者権限で実行するか、ダブルクリック(標準ユーザー権限)で実行するかでカレントディレクトリが異なります。
コマンドプロンプトとPowerShellで比較しました。
コマンドプロンプト
以下のようなバッチファイルを作成して、管理者権限・ダブルクリックで実行してみます。
C:\work\CurrentDirectory.bat
cd
pasue
@echo off を1行目に記述するとコマンドが非表示になる。
管理者権限で実行
C:\Windows\System32
ダブルクリックで実行
C:\work
管理者権限でバッチファイルを実行するとカレントディレクトリが変わります。
このようにバッチファイルでパスを使用する際は注意が必要です。
上記の際は、魔法のおまじない「%0」が有効です。
以下サンプルです。
C:\work\CreateADUser.bat
C:\work\CreateADUser.ps1
C:\work\ADUserData.csv
powershell -NoProfile -ExecutionPolicy RemoteSigned -File %~dpn0.ps1 %~dp0ADUserData.csv
pause
このバッチで指定した実行ポリシーはセッション内でのみ有効となり、CurrentUserやLocalMachineの実行ポリシーを変更しません。
Param(
[String]$CSVPath
)
if(!(Test-Path -Path $CSVPath)){
Write-Host "CSVファイルが存在しません"
exit
}
Import-Csv -Path $CSVPath | fl
こんな感じでバッチファイルを見ると「%~dp0」はいろんなところで出現します。
cd %~dp0またはpushd %~dp0で移動するのも手です。
※この例のCSVのパスはPSスクリプトで相対パスを宣言したほうが楽です。
PowerShell
以下のようなPSスクリプトを作成して、管理者権限・ダブルクリックで実行してみます。
C:\work\CurrentDirectory.ps1
Get-Location |fl
Read-Host 続行するには何かキーを押してください . . .
管理者権限で実行
Drive : C
Provider : Microsoft.PowerShell.Core\FileSystem
ProviderPath : C:\work
Path : C:\work
管理者権限なし(=ダブルクリック)で実行
Drive : C
Provider : Microsoft.PowerShell.Core\FileSystem
ProviderPath : C:\work
Path : C:\work
PSスクリプトを管理者権限で実行してもカレントディレクトリが変わりません。
おわりに
PSスクリプトの実行ポリシーを説明するのが面倒な時に利用しました。
参考
Discussion