¿El comando de llamada por lotes de Windows no pasa el valor de la variable?

¿El comando de llamada por lotes de Windows no pasa el valor de la variable?

Obtengo un resultado extraño al ejecutar mi script:

@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

Debería mostrar la ubicación de la carpeta que selecciono. en lugar de eso, el eco está desactivado.

Respuesta1

Obtengo un resultado extraño al ejecutar mi script

Para depurar sus scripts por lotes, comente la @echo offlínea para que pueda ver lo que está sucediendo:

rem @echo off

Estás setlocal enabledelayedexpansionen el lugar equivocado. Muévalo al principio del archivo.

prueba.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

Salida de ejemplo (seleccioné "Escritorio"):

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

F:\test>

Nota:

  • Aún aparecerá ECHO is off.si presiona "Cancelar" la primera vez que se muestra el cuadro de diálogo.

información relacionada