长期听众第一次来电。
我正在尝试使用Windows批处理脚本来搜索目录中包含的文件中的特定字符串,并使用文件名和随机值对它们进行分类,以便进一步处理。
这是我根据类似帖子整理的内容:
setlocal enabledelayedexpansion
for %%a in (C:\Temp\*.txt) do (
set t1=string1-%RANDOM%.txt
set t2=string2-%RANDOM%.txt
find "string1" %%~fa && ren %%~fa %t1%
find "string2" %%~fa && ren %%~fa %t2%
)
如果我在for循环之外移动set命令它会起作用,但我需要它在循环中生成一个随机文件名,以防有多个文件找到'string1'。
任何帮助非常感谢! 感谢。
答案 0 :(得分:1)
在cmd中,当引用它们的块时,变量将替换为它的值。在您的情况下,您的设置变量会被替换一次,当for表示reed,并且更改不可见,因为一旦完成替换,就不会有更多的变量替换。这就是enabledelayedexpansion
的原因,但需要更改代码
setlocal enabledelayedexpansion
for %%a in (C:\Temp\*.txt) do (
set t1=string1-!RANDOM!.txt
set t2=string2-!RANDOM!.txt
find "string1" "%%~fa" && ren "%%~fa" !t1!
find "string2" "%%~fa" && ren "%%~fa" !t2!
)
对于变量的延迟扩展,有必要向cmd指示在每次访问中应该替换哪些变量。要做到这一点,请改变%!使用变量时。对于for
命令(您的%%a
)中的控制变量,这不是必需的。
请注意,您的代码无法处理重复文件名的可能性。随机意味着随机,而不是唯一。碰撞是可能的。