将符合条件的目录中的所有文件传递给程序

时间:2013-02-21 04:06:29

标签: batch-file

在Windows资源管理器中,当我将100个文件拖放到批处理文件上时,我收到一条错误消息,指出“传递给系统调用的数据区域太小”

我生成批处理文件以获取100个参数,认为它可以正常工作

MyProg.exe %1 %2 %3 %4 %5 ... %100

MyProg采取了一系列路径并为他们做了一些事情。

所以现在我的解决方案是

for %%X in (*.my_ext) do (
    MyProg.exe %%X
)

但这是一次又一次地初始化我的程序,因为我只是将一个文件传递给它,这有点违背了接受任意数量的参数的目的,而这个启动+结束会减慢速度。

理想情况下,我想将所有文件传递给我的程序并让它运行。 我该如何做到这一点?

编辑:

我想要的一个想法就是这个:How to concatenate strings in a Windows batch file?

我的解决方案现在看起来像这样。我有两个批处理文件get_files.batmain.bat

get_files.bat

@echo off
set myvar=myProg.exe
for /r %%i in (*.my_ext) DO call :concat "%%i"
echo %myvar%
goto :eof

:concat
set myvar=%myvar% %1
goto :eof

main.bat

call get_files.bat > out.bat
call out.bat

我首先创建我要调用的命令,然后调用它。 这允许我将100个与给定crieria匹配的路径传递给我的程序,尽管在某些时候我似乎达到了输入字符串可以有多长的限制。

理想的解决方案看起来像构建尽可能长的列表并将该列表传递给程序,然后重复直到所有文件都已处理完毕。可以递归地搜索文件等。

1 个答案:

答案 0 :(得分:0)

Microsoft已发布支持文章command prompt (cmd. exe) command-line string limitation

  

在运行Microsoft Windows XP或更高版本的计算机上,您可以在命令提示符处使用的字符串的最大长度为8191个字符。在运行Microsoft Windows 2000或Windows NT 4.0的计算机上,您可以在命令提示符处使用的字符串的最大长度为2047个字符。

在执行包含许多文件的应用程序时,避免此限制的最佳方法是使用Andriy M建议的列表文件。

例如,WinRAR将以@开头的文件名解释为列表文件的名称,该列表文件逐行包含要压缩/提取的文件的名称。

文本编辑器UltraEdit支持命令行选项/f"name of list file"以打开指定列表文件中逐行列出的所有文件。

文件管理器Total Commander在Total Commander调用的应用程序的命令行中支持%L, %l, %F, %f, %D, %d, %WL, %WF, %UL, %UF。在其中一个占位符存在的情况下,Total Commander在临时文件的目录中创建一个列表文件,其中所选文件的名称逐行写入,然后使用此列表文件的名称启动应用程序。 Total Commander甚至监督已启动的应用程序,并在应用程序终止后删除列表文件。

我认为,在您的情况下,您的应用程序最有可能在逐行处理此文件中列出的所有文件后删除列表文件本身。