編集 - npocmaka、あなたは正しいです。変。
元の回答が削除されました - 私は間違っていました。
しかし、問題はcall
コマンドではありません。問題は引用符とcmdです。
テスト後、ファイル名がどのように処理され、cmd が API 呼び出しでいくつかのエラーをどのように処理するかについて、バグ/機能のように見えます。
次のバッチ ファイル (test.cmd) を使用
@echo off
setlocal enableextensions
echo Calling subroutine from drive d:
call :getInfo
echo.
c:
echo Calling subroutine from drive c:
call :getInfo
echo.
echo Getting data directly without subroutine
:getInfo
echo ---------------------------------------------------------
echo cd : %cd%
echo d0 : %~d0
echo dp0 : %~dp0
echo f0 : %~f0
echo ---------------------------------------------------------
echo.
goto :EOF
d:\temp\testCMD に配置され、ドライブ c: の現在のディレクトリは C:\Users です。実行結果は次のとおりです。
1.- cmd ディレクトリから引用符なしで呼び出す:test.cmd
Calling subroutine from drive d:
---------------------------------------------------------
cd : D:\temp\testCMD
d0 : D:
dp0 : D:\temp\testCMD\
f0 : D:\temp\testCMD\test.cmd
---------------------------------------------------------
Calling subroutine from drive c:
---------------------------------------------------------
cd : C:\Users
d0 : D:
dp0 : D:\temp\testCMD\
f0 : D:\temp\testCMD\test.cmd
---------------------------------------------------------
Getting data directly without subroutine
---------------------------------------------------------
cd : C:\Users
d0 : D:
dp0 : D:\temp\testCMD\
f0 : D:\temp\testCMD\test.cmd
---------------------------------------------------------
結果:すべてOK。
2.- cmd ディレクトリから引用符で呼び出す"test.cmd"
(いいえ、call
コマンドは必要ありません)
Calling subroutine from drive d:
---------------------------------------------------------
cd : D:\temp\testCMD
d0 : D:
dp0 : D:\temp\testCMD\
f0 : D:\temp\testCMD\test.cmd
---------------------------------------------------------
Calling subroutine from drive c:
---------------------------------------------------------
cd : C:\Users
d0 : D:
dp0 : D:\temp\testCMD\
f0 : D:\temp\testCMD\test.cmd
---------------------------------------------------------
Getting data directly without subroutine
---------------------------------------------------------
cd : C:\Users
d0 : C:
dp0 : C:\Users\
f0 : C:\Users\test.cmd
---------------------------------------------------------
結果: cmd のメイン実行行から直接取得した場合にのみ、%~d0 の正しい値を取得できません。サブルーチン呼び出しと同じことが期待どおりに機能します。
引用符なしでテストされたすべてのシナリオは、失敗することなく機能します。引用符を使用して、呼び出し行にドライブ (ej: "d:.\test.cmd"
) が含まれている場合、すべての値が正しく取得されます。ドライブがバッチ コールに含まれていない場合 (ej:"test.cmd"
パスにバッチ ディレクトリがある場合、または"\temp\testCMD\test.cmd"
D: のルートから)、誤った値が取得されますが、バッチ ファイルの実行のメイン行からのみ取得されます。サブルーチンは常に正しい値を取得します。
なんで?わかりません。しかし、procmon を使用して cmd の実行をトレースする場合、失敗した場合、cmd.exe がファイルの情報を取得しようとすると、QueryDirectory API 呼び出しが行われ、応答C:\Users\test.cmd
が返されますが、cmd はそれを無視して実行を継続し、間違った値を表示します。NO SUCH FILE
では、無回答です、すみません。しかし、私はこれを「文書化」しなければなりませんでした。部屋に教祖?
更新:詳細はこちら