is_local_or_nw_drive.bat
は UNC パスには chdir
できないことを利用して
%CD%
(カレントディレクトリ) と %~dp0
(BATが置かれているディレクトリ) が異なる場合に
ネットワークドライブと判定することを意図したもの.
結論として、この方法は種々の問題があるため他の方法を使うべき.
-
ネットワークドライブ上 (UNCパス) で
is_local_or_nw_drive.bat
を実行# PowerShell なら UNC パスに chdir できるのでここから bat を実行してみる PS Microsoft.PowerShell.Core\FileSystem::\\VM-WIN10-01\share\GD> .\is_local_or_nw_drive.bat '\\VM-WIN10-01\share\GD' CMD.EXE was started with the above path as the current directory. UNC paths are not supported. Defaulting to Windows directory. '\\VM-WIN10-01\share\GD\' CMD does not support UNC paths as current directories. %CD% == "C:\Windows" %~dp0 == "\\VM-WIN10-01\share\GD\" ローカルドライブ上で実行してください (デスクトップ等) Press any key to continue . . .
ネットワークドライブにマップしてドライブレターが割り当てられれば chdir
可能なので "%CD%\" == "%~dp0"
とならない.
-
mapped drive 上で
is_local_or_nw_drive.bat
を実行X:\GD>net use New connections will be remembered. Status Local Remote Network ------------------------------------------------------------------------------- OK X: \\VM-WIN10-01\share Microsoft Windows Network The command completed successfully. X:\GD>.\is_local_or_nw_drive.bat %CD% == "X:\GD" %~dp0 == "X:\GD\" Press any key to continue . . . X:\GD>
ドライブレター
+ 中間ディレクトリパス
の場合 %CD%
は末尾に \
が無く %~dp0
は末尾に \
があるので,
それを想定して条件式を "%CD%\" == "%~dp0"
としている (%CD%
の末尾に \
を付与している).
ドライブ直下の場合 %CD%
の末尾も \
で終わるのでこの条件式だと成立しない.
bat の文字列置換には疎いのだが、なんとかして「末尾に \
がある場合削除」ができれば解決できるかもしれない.
-
Pドライブ直下で
is_local_or_nw_drive.bat
を実行P:\>.\is_local_or_nw_drive.bat %CD% == "P:\" %~dp0 == "P:\" ローカルドライブ上で実行してください (デスクトップ等) Press any key to continue . . .
- PathIsUNCA function (shlwapi.h)
- PowerShell でできないか
- WShell でできないか
コードポイント変更時の
Active code page: 65001
というメッセージを表示にするためのもの