1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

DOSバッチ処理では、カレントディレクトリのソリューションとしてUNCパスをサポートしていません。

2022-02-10 12:22:26

そのまま、コードに進み、Internet Neighborhoodを開く→ネットワーク全体→Microsofi Windows Network→ワークグループ内の対応するコンピュータを見つけ、ダブルクリックで以下のバッチコードをテストします。
カレントディレクトリを表示する.bat

cd /d %~dp0
echo %cd%

pushd %~dp0
echo %cd%
popd
pause

このように、UNCディレクトリにジャンプするためにcdコマンドを使い始めると、"CMD does not support the UNC path as the current directory."、つまり、cdコマンドはローカルディレクトリにしかジャンプできず、UNCディレクトリにはできないことがわかります。

では、どう良いのでしょうか?2つ目のコマンド、pushdを見てください。pushd %~dp0" を使うと、UNCパスをローカルのZドライブにマッピングすることができます。このコマンドを実行すると、次のプロンプトは元のC:↵ではなく、マッピングに成功したUNCパスであるZ:↵になっていますね。

この時点で、UNCディレクトリをローカルディレクトリのように操作することができます(実際にはマイコンピュータにZドライブのマッピングがあり、これがローカルのハードディスクに相当します)。図のようにcd、dirなどのコマンドが使えるようになります。

最後に、ここまでやったらpopdを使ってマッピングを切断するのを忘れないように。切断すると、プロンプトは再び元のC:⇄Windows>になります。

もう一つの良い解決策は、バッチプロセスがあるディレクトリの前に変数 %~dp0 を直接追加することです。バッチ名を呼び出すか、それをコピーしてください。
ただし、一般的にファイル共有は読み込み専用、UNCディレクトリは書き込み不可なので、echo > file1.txt, fiel1.txt のような文は %~dp0 を付けてはいけないし、デフォルトは C:\windows ディレクトリだけであることに注意してください。

@echo off
%~dp0bootice\BOOTICEx86 /DEVICE=0 /mbr /install /type=GRUB4DOS /v045 /boot_file=grldr /quiet
echo n|copy /-y %~dp0grub\grldr.* %systemdrive%\
echo n|copy /-y %~dp0grub\menu.lst %systemdrive%\
attrib +h %systemdrive%\grldr.*
attrib +h %systemdrive%\menu.lst
ECHO ┌─────────────────────────────────┐
ECHO │ Already wrote grub4dos to the hard disk MBR! Press any key to exit.     │
ECHO └─────────────────────────────────┘
pause >nul

サポートされていないUNCパスの解決 Additional

本日、Win7システムで共有ファイルパスにあるbatスクリプトを実行したところ、以下のエラーメッセージに遭遇しました。

その内容は

CMD.EXEは、上記のパスをカレントディレクトリとして起動されました。UNC パスはサポートされていません。デフォルトでは、Windowsのディレクトリが設定されています。

発生原因

おそらくネットワークパス内にあるためだと思いますが、通常のディレクトリ内であれば問題ありません。

回避策

レジストリに、値を追加するだけです。パスは以下の通りです。
HKEY_CURRENT_USER SoftwareMicrosoft Command Processor
DisableUNCCheckという値を追加し、REG_DWORDをタイプして値を1(16進数)に設定します。

バッチファイルは次のようになります(正しいプロンプトで実行されますが、実際には追加されないため、修正が必要です)。

<ブロッククオート

HKEY_CURRENT_USERSoftwareMicrosoftCommand Processor" /v "DisableUNCCheck" /t "REG_DWORD" /d " ;1" /f

今回の記事はここまでです。