使用/ R标志将批处理脚本输出到正确的子目录

我目前正面临着我需要每个子目录中的进程文件的问题,我正在使用for循环,如下所示:

for /R %%x in (*.dat) do tool.exe -c -f -e "%%x" 

现在它处理所有内容,但是工具会输出一个文件,并且该文件始终位于启动批处理脚本的目录中,而不是位于原始文件所在的目录中。 我尝试了很多方法,比如使用%CD%作为工具的输出目录选项,但是看起来这个工具并不是那么喜欢它,只是给出错误。

我正在寻找一个通用的解决scheme,因为我现在有很多CLI工具都有这个问题。

在调用tool.exe之前,您可以将CD tool.exe当前.dat所在的目录中:

 for /R %%x in (*.dat) do ( cd "%%~dpx" & tool.exe -c -f -e "%%x") 

我迟到了,但补充Andriy的回答,你可以通过结合两个FOR循环简化BAT,这可能会稍微更有效率,更清晰。

 for /D /R %%d in (*) do ( pushd %%d for %%x in (*.dat) do tool.exe -c -f -e "%%x" popd ) 

作为一个额外的好处,这个版本将解决主循环引用一个不同的驱动器的情况(这不是在这个特定的OP问题的情况下),并具有恢复每次迭代当前目录的相对边值,这也可能在环路中包含其他命令的情况下是很重要的。

你可以使用forfiles

 forfiles /s /C /m *.dat "cmd /c tools.exe @file" 

有关更多信息,请参阅http://ss64.com/nt/forfiles.html