Scripting 批处理文件中的行为不一致';s代表声明

Scripting 批处理文件中的行为不一致';s代表声明,scripting,batch-file,for-loop,cmd,Scripting,Batch File,For Loop,Cmd,我在批处理文件方面做得很少,但我正试图追踪在遗留系统上遇到的一个奇怪的bug 我在特定文件夹中有许多.exe文件。这个脚本应该用不同的文件名复制它们 批处理文件中的代码 for %%i in (*.exe) do copy \\networkpath\folder\%%i \\networkpath\folder\%%i.backup.exe (注意:源文件夹和目标文件夹相同) 所需行为的示例: File1.exe --> Becomes --> File1.exe.backu

我在批处理文件方面做得很少,但我正试图追踪在遗留系统上遇到的一个奇怪的bug

我在特定文件夹中有许多.exe文件。这个脚本应该用不同的文件名复制它们

批处理文件中的代码

for %%i in (*.exe) do copy \\networkpath\folder\%%i \\networkpath\folder\%%i.backup.exe
(注意:源文件夹和目标文件夹相同)

所需行为的示例:

File1.exe -->  Becomes -->  File1.exe.backup.exe
File2.exe -->  Becomes -->  File2.exe.backup.exe
File1.exe.backup.exe
File1.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
etc...
File2.exe.backup.exe
File2.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
首先,让我说,这不是我将采取的方法。我知道还有其他(可能更直接的)方法可以做到这一点。我也知道,你可能会想,我们到底为什么要创建一个FileX.exe.backup.exe。但是这个脚本已经运行多年了,我听说这个问题是最近才开始的。我试图找出问题所在,而不是重写代码(即使它很琐碎)

错误输出示例:

File1.exe -->  Becomes -->  File1.exe.backup.exe
File2.exe -->  Becomes -->  File2.exe.backup.exe
File1.exe.backup.exe
File1.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
File1.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
etc...
File2.exe.backup.exe
File2.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
File2.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe.backup.exe
由于不了解批处理文件,我查看了一下,发现每次迭代后都会重新评估
for
语句的条件-创建一个(近乎)无限的复制循环(我可以看到,当名称太长时,复制最终会失败)

这可以解释我看到的行为。当清理有问题的目录时,它只有原始的File1.exe文件并运行脚本,它生成了错误代码。问题是我不能在其他任何地方复制这种行为

当我在本地创建一个包含几个.exe文件的文件夹并运行脚本时,我得到了预期的输出。是的,如果我再次运行它,我会得到一个“File1.exe.backup.exe.backup.exe”实例(并且每次我再次运行它,它的长度会增加一个)。但我不能让它进入接近无限循环的情况

这让我快发疯了

这个bug发生在一个联网的位置上,所以我尝试在其中一个位置上重新创建它,但同样没有成功。因为它是一个共享的网络位置,我想知道它是否与其他人访问或修改文件夹中的文件有关,甚至引入了延迟,并编写了一个小程序在同一文件夹中执行操作,但没有成功

我在“for”语句中找到的文档并没有真正的帮助,但我运行的所有测试似乎都表明(*.exe)部分中的
在执行开始时只计算一次


有人对这里可能发生的事情有什么建议吗

我同意安德烈·M的评论——这似乎与

以下更改应该可以解决此问题:

for /f "eol=: delims=" %%i in ('dir /b *.exe') do copy \\networkpath\folder\%%i \\networkpath\folder\%%i.backup.exe

任何以分号开头的文件(可能性很小,但也可能发生)都将使用默认的分号EOL跳过。为了安全起见,您应该将EOL设置为无法启动文件名(或任何路径)的字符。这就是我选择冒号的原因-它不能出现在文件夹或文件名中,只能出现在驱动器号之后。因此,它应该总是安全的。

复制在目标路径中也支持通配符。你可以用

copy \\networkpath\folder\*.exe \\networkpath\folder\*.backup.exe
相关或相同: