📁

バッチファイルとPSスクリプトのカレントディレクトリ

2022/11/26に公開

はじめに

表題の通り、初めてバッチファイルを作成した際にカレントディレクトリで困ったので、これからbatまたはps1を作成しようとしている人の助けになれば幸いです。

カレントディレクトリが異なる

管理者権限で実行するか、ダブルクリック(標準ユーザー権限)で実行するかでカレントディレクトリが異なります。
コマンドプロンプトとPowerShellで比較しました。

コマンドプロンプト

以下のようなバッチファイルを作成して、管理者権限・ダブルクリックで実行してみます。
C:\work\CurrentDirectory.bat

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

CreateADUser.bat
powershell -NoProfile -ExecutionPolicy RemoteSigned -File %~dpn0.ps1 %~dp0ADUserData.csv 
pause

このバッチで指定した実行ポリシーはセッション内でのみ有効となり、CurrentUserやLocalMachineの実行ポリシーを変更しません。

CreateADUser.ps1
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

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スクリプトの実行ポリシーを説明するのが面倒な時に利用しました。

参考

https://qiita.com/boma/items/6430a081f23e4af9ca01
https://qiita.com/resolver/items/7187bd6ee8016ee5c741
https://qiita.com/earthdiver1/items/b3f529c81f5892972a72

Discussion