批处理目录中的所有文件

10

目前我有一个批处理任务,它调用另一个文件并传递可执行文件需要运行的变量(密码和文件名)。

例如:

> cd f:\test\utils 
> admin import-xml -Dimport.file=f:\DB\file1.xml  -Dadmin.db.password=test123

我写了一个程序来实现这个功能,但是发现需要处理多个文件。

用户名和密码不变,但文件名会有15个不同的xml文件,而且可能还会有更多的文件。

这些文件总是位于同一个文件夹中。我能否编写一个程序来处理该文件夹中的所有文件,要么等待一个文件完成后再处理下一个文件,要么在开始处理下一个文件之前加入3分钟的休眠时间,而不是最终得到15-20个不同的程序(每个文件一个程序)?

3个回答

32
pushd C:\test\utils
for %%F in (F:\DB\*.xml) do (
   admin import-xml "-Dimport.file=%%~dpnxF" -Dadmin.db.password=test123
)
popd

%%~dpnxF会展开为当前文件的驱动器(d)、路径(p)、文件名(n)和扩展名(x)。

如果您想在该循环中设置并使用环境变量(%foo%),请先阅读help set以避免出问题。


很棒。能够使用这个来达到我所需的目的。谢谢。 - Gabriel
你能解释一下如何避免for循环内使用set的问题吗? - Snekse
Snekse,那个神奇的词是延迟变量扩展。这是我在回答每个批处理文件问题时必须解释的内容。在help set中也有很好的解释。 - Joey
感谢您的编辑,tastybento。它确实是正确的(但我改变了变量名称以使其更易于理解);不幸的是,有一些没有理解他们所审查内容的评审人员拒绝了它。对于那些评审人员:如果您不理解某个编辑,请跳过审查并将其留给那些理解的人。你们中没有任何人在批处理文件方面有任何可见的经验(至少在SO上)。 - Joey

8
您可以使用for命令。在批处理文件中,可以像这样使用:
for %%f in (*.xml) do call myotherbatch.bat %%f

假设您运行的admin命令在任务完成前不会返回,上面的循环会按顺序处理它们。
如果您在提示符下运行命令(而不是在批处理文件中),请只使用一个%。

0
for file in f:\DB\*
do
   admin import-xml -Dimport.file="$file" -Dadmin.db.password=test123
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接