Depois de brincar com isso por um tempo, eu criei esta solução de trabalho:
@echo off
rem collect the filenames
dir /s /b "G:\Test-folder\ab*" >"G:\Test-folder\list.txt"
rem process each file
for /f "usebackq delims=" %%f in ("G:\Test-folder\list.txt") do call :work "%%~f"
@echo.
rem Note: I still could not make this work with "setlocal enabledelayedexpansion".
goto :EOF
:work
rem :work
set "f1=%~1"
if exist "%f1%" goto :dostuff
@echo.
@echo File "%f1%" not found.
@echo %f1%
@echo "%~1"
@echo %~1
@echo.
rem Notice that the "action" of this (next) for-loop is: [set "f1=%%~f"]
rem which uses the "for-variable" from the "outer" for-loop: "%%f"
rem instead of the "for-variable" from the "this" for-loop: "%%g"
@for /f "usebackq delims=" %%g in ('echo "dummy"') do set "f1=%%~f"
if exist "%f1%" goto :dostuff
@echo File "%f1%" not found.
@echo %f1%
@echo.
goto :EOF
:dostuff
rem do some stuff :dostuff
@echo File "%f1%" found.
for %%g in ("%f1%") do echo name:"%%~ng" extn:"%%~xg" file-size:"%%~zg"
@echo.
goto :EOF
A saída da execução deste script é:
File "G:\Test-folder\Abcxyz 1.txt" found.
name:"Abcxyz 1" extn:".txt" file-size:"14"
File "G:\Test-folder\Abcxyz2.txt" found.
name:"Abcxyz2" extn:".txt" file-size:"13"
File "G:\Test-folder\Abcxyz3.txt" found.
name:"Abcxyz3" extn:".txt" file-size:"13"
File "G:\Test-folder\Abc^^xyz 1.txt" not found.
G:\Test-folder\Abc^xyz 1.txt
"G:\Test-folder\Abc^^xyz 1.txt"
G:\Test-folder\Abc^xyz 1.txt
File "G:\Test-folder\Abc^xyz 1.txt" found.
name:"Abc^xyz 1" extn:".txt" file-size:"15"
File "G:\Test-folder\Abc^^xyz2.txt" not found.
G:\Test-folder\Abc^xyz2.txt
"G:\Test-folder\Abc^^xyz2.txt"
G:\Test-folder\Abc^xyz2.txt
File "G:\Test-folder\Abc^xyz2.txt" found.
name:"Abc^xyz2" extn:".txt" file-size:"14"
File "G:\Test-folder\Abc^^xyz3^^.txt" not found.
G:\Test-folder\Abc^xyz3^.txt
"G:\Test-folder\Abc^^xyz3^^.txt"
G:\Test-folder\Abc^xyz3^.txt
File "G:\Test-folder\Abc^xyz3^.txt" found.
name:"Abc^xyz3^" extn:".txt" file-size:"15"
acidentalmente "tropecei" nessa solução de trabalho que usa um método que pode ser um comportamento não documentado de loops forçados aninhados.
Eu estava tentando usar "sed" para alterar o "^^"
na string entre aspas para um único "^"
, assim:
@for /f "usebackq delims=" %%g in ('echo "%f1%"^|sed -r "s/(\x5e)//g"') do set "f1=%%~g"
Por engano eu digitei isso:
@for /f "usebackq delims=" %%g in ('echo "%f1%"^|sed -r "s/(\x5e)//g"') do set "f1=%%~f"
Eu não fiquei realmente surpreso (no início) quando isso funcionou, porque eu pensei que "sed" estava funcionando como esperado. Então, percebi que usei a variável errada: set "f1=%%~f"
em vez de: set "f1=%%~g"
, o que foi surpreendente.
Alterei para usar a variável correta: set "f1=%%~g"
, apenas para descobrir que não funcionou.
Eu tentei várias versões disso, incluindo:
@for /f "usebackq delims=" %%g in ('echo "%f1%"') do set "f1=%%~g"
nenhum dos quais funcionou.
Portanto, isso só parece funcionar se for "mal utilizado" usando a variável errada. Embora isso pareça útil neste caso, eu tenho dificuldade em acreditar que funcionará a longo prazo.
Eu ficaria muito interessado em ouvir de outras pessoas se isso é realmente um comportamento "documentado" (esperado) ou não.