Windows バッチ呼び出しコマンドが変数値を渡さないのはなぜですか?

Windows バッチ呼び出しコマンドが変数値を渡さないのはなぜですか?

スクリプトを実行すると奇妙な出力が表示されます:

@echo off
setlocal
pushd "%~dp0"

set Mode=batch

if "%Mode%"=="batch" call :BATCH
echo %Loc%
pause>nul
exit

:BATCH
set "psCommand="(new-object -COM 'Shell.Application')^
.BrowseForFolder(0,'Please choose a folder.',0,0).self.path""
for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "folder=%%I"
setlocal enabledelayedexpansion
set Loc=!folder!
Goto:eof

選択したフォルダーの場所が表示されるはずです。代わりに、エコーがオフになっています。

答え1

スクリプトを実行すると奇妙な出力が表示されます

バッチ スクリプトをデバッグするには、@echo offその行をコメント化して、何が起こっているかを確認します。

rem @echo off

setlocal enabledelayedexpansion間違った場所にあります。ファイルの先頭に移動してください。

テスト.cmd:

@echo off
setlocal
setlocal enabledelayedexpansion
pushd "%~dp0"

set Mode=batch

if "%Mode%"=="batch" call :BATCH
echo %Loc%
pause>nul

:BATCH
set "psCommand="(new-object -COM 'Shell.Application')^
.BrowseForFolder(0,'Please choose a folder.',0,0).self.path""
for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "folder=%%I"
set Loc=!folder!
Goto:eof

出力例 (「デスクトップ」を選択しました):

F:\test>test
C:\Users\DavidPostill\Desktop

F:\test>

注記:

  • ECHO is off.ダイアログが初めて表示されたときに「キャンセル」を押しても、ダイアログは表示されます。

関連情報