for 循环批处理脚本中路径中的 findstr 命令变量扩展(windows,批处理脚本)
findstr command variable expansion in path in for loop batch script(windows, batch script)
echo off
set "MasterFolder=C:\Users\Development\test_folder"
SetLocal EnableDelayedexpansion
@FOR /f "delims=" %%f IN ('dir /b /s "%MasterFolder%\*.txt"') DO (
set /a "idx+=1"
set "FileName[!idx!]=%%~nxf"
set "FilePath[!idx!]=%%~dpFf"
)
for /L %%i in (1,1,%idx%) do (
echo [%%i] "!FileName[%%i]!"
set "loc=%MasterFolder%\!FileName[%%i]!"
echo path: %MasterFolder%\!FileName[%%i]!
echo loc: !loc!
FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "%MasterFolder%\test_1.txt"') DO (
set new_pos=%%1
echo new_pos !new_pos!
)
)
以上代码有效,但以下代码无效。
echo off
...
FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "%MasterFolder%\!FileName[%%i]!"') DO (
set new_pos=%%1
echo new_pos !new_pos!
)
)
echo off
...
FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "!loc!"') DO (
set new_pos=%%1
echo new_pos !new_pos!
)
)
我所做的只是将 test_1.txt 替换为 !FileName[%%i]!,或者使用新变量并将所有替换为 ” !loc!".
但是最后两个代码不起作用,我需要这种方式,因为它通过第一个for循环自动获取文件夹中的文件名。
我猜是findstr或者变量展开顺序有错误,但我很难弄清楚。
很明显!
当使用 !file...
时,您在该行中引入了一个感叹号。
这会触发 phase 5 (delayed epxansion phase) of the parser。
在那个阶段,变量被扩展 并且插入符号用于转义下一个字符 ,与它们所在的位置(是否被引用)无关!
因此您的搜索字符串 "^"
被转换为 ""
。
只需将插入符号加倍到 findstr /o "^^" !File...
感叹效果有点出乎意料
setlocal EnableDelayedExpansion
echo One Caret "^"
echo One Caret "^" and a bang ^^!
输出
One Caret "^"
One Caret "" and a bang !
echo off
set "MasterFolder=C:\Users\Development\test_folder"
SetLocal EnableDelayedexpansion
@FOR /f "delims=" %%f IN ('dir /b /s "%MasterFolder%\*.txt"') DO (
set /a "idx+=1"
set "FileName[!idx!]=%%~nxf"
set "FilePath[!idx!]=%%~dpFf"
)
for /L %%i in (1,1,%idx%) do (
echo [%%i] "!FileName[%%i]!"
set "loc=%MasterFolder%\!FileName[%%i]!"
echo path: %MasterFolder%\!FileName[%%i]!
echo loc: !loc!
FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "%MasterFolder%\test_1.txt"') DO (
set new_pos=%%1
echo new_pos !new_pos!
)
)
以上代码有效,但以下代码无效。
echo off
...
FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "%MasterFolder%\!FileName[%%i]!"') DO (
set new_pos=%%1
echo new_pos !new_pos!
)
)
echo off
...
FOR /F "tokens=1,2 delims=:" %%1 in ('findstr /o "^" "!loc!"') DO (
set new_pos=%%1
echo new_pos !new_pos!
)
)
我所做的只是将 test_1.txt 替换为 !FileName[%%i]!,或者使用新变量并将所有替换为 ” !loc!".
但是最后两个代码不起作用,我需要这种方式,因为它通过第一个for循环自动获取文件夹中的文件名。
我猜是findstr或者变量展开顺序有错误,但我很难弄清楚。
很明显!
当使用 !file...
时,您在该行中引入了一个感叹号。
这会触发 phase 5 (delayed epxansion phase) of the parser。
在那个阶段,变量被扩展 并且插入符号用于转义下一个字符 ,与它们所在的位置(是否被引用)无关!
因此您的搜索字符串 "^"
被转换为 ""
。
只需将插入符号加倍到 findstr /o "^^" !File...
感叹效果有点出乎意料
setlocal EnableDelayedExpansion
echo One Caret "^"
echo One Caret "^" and a bang ^^!
输出
One Caret "^"
One Caret "" and a bang !