我真的很喜欢foxidrive的做法。尽管如此,我想提供一个解决方案,消除所有列出的限制(尽管cmd
文件大小 < 2 GiB 和行长度 < ~ 8 KiB 等相关限制仍然存在)。
关键是延迟扩展,需要切换到不丢失感叹号。这解决了特殊字符的所有潜在问题,如^
, &
, %
, !
, (
, )
, <
, >
,|
和"
.
计数器index
的实现是为了不丢失原始文本文件的一行,如果没有,可能会发生这种情况,因为random
可能会返回重复值;index
附加后,生成的变量名称是$$!random!.!index!
唯一的。
该findstr /N /R "^"
命令在原始文件的每一行之前都有一个行号,后跟一个冒号。for /F
因此,没有任何行在循环中会出现空,这会忽略此类。行号也隐含地解决了前导分号的问题,即 . 的默认eol
字符for /F
。
最后,直到并包括第一个冒号的所有内容(请记住由添加的上述前缀findstr
)在输出之前从每一行中删除,因此不再删除前导等号。
所以这里是代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set /A "index=0"
for /f "delims=" %%a in ('findstr /N /R "^" "%~dpn0.lst"') do (
setlocal EnableDelayedExpansion
for /F %%b in ("$$!random!.!index!") do (
endlocal
set "%%b=%%a"
)
set /A "index+=1"
)
> "%~dpn0.new" (
for /f "delims=" %%a in ('set $$') do (
set "item=%%a"
setlocal EnableDelayedExpansion
echo(!item:*:=!
endlocal
)
)
endlocal
exit /B