如何在批处理文件中循环匹配通配符的文件

Luk*_*ell 182 command-line windows-xp batch-file

我有一组基本文件名,每个名称'f'都有两个文件,'f.in'和'f.out'.我想编写一个批处理文件(在Windows XP中),它通过所有文件名,每个文件名应该:

  • 显示基本名称'f'
  • 对'f.in'执行操作
  • 对'f.out'执行另一个操作

除了搜索*.in(或*.out)之外,我没有办法列出基本文件名集.

Jim*_*uck 282

假设您有两个程序来处理这两个文件:process_in.exe和process_out.exe:

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)
Run Code Online (Sandbox Code Playgroud)

%% ~nf是替换修饰符,仅将%f扩展为文件名.请参阅https://technet.microsoft.com/en-us/library/bb490909.aspx(页面中间)或下一个答案中的其他修饰符.

  • 如果在命令行中输入,请使用单个'%'.我知道OP不会询问命令行,但是当我在谷歌搜索的顶部出现这个问题时,这就是我正在搜索的内容.其他人可能会欣赏这一点. (44认同)
  • @ColonelPanic - 有一些`~`修饰符可以做,比如我的例子,只需要获取文件名.我只是习惯使用它,以防`*`完成全部路径或其他事情.有一些这些修饰符(页面中间):http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx?mfr = true (6认同)
  • 另外,请注意%% f变量必须是单个字母 - 如果您尝试使用可读且有意义的内容,则会出现神秘的错误消息. (3认同)
  • 你能解释一下语法吗?循环变量被声明为`%%f` 为什么后来是`%%~nf`? (2认同)

Mar*_*ram 85

您可以使用此行打印桌面内容:

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 
Run Code Online (Sandbox Code Playgroud)

一旦你有%%I变量就可以很容易地对它执行一个命令(只需用你的程序替换单词echo)

此外,FOR变量引用的替换已得到增强您现在可以使用以下可选语法:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only (directory with \)
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string


[https://ss64.com/nt/syntax-args.html][1]
Run Code Online (Sandbox Code Playgroud)

在上面的示例中%I,PATH可以替换为其他有效值.该%~语法被一个有效的FOR变量名终止.选择大写变量名称%I会使其更具可读性并避免与修饰符混淆,修饰符不区分大小写.

您可以通过键入来获取完整的文档 FOR /?

  • @Brad,如果你在命令行中使用它(而不是在批处理文件中),那么使用`%I`代替`%% I` (3认同)

Nat*_*itz 5

我认为,最简单的方法是使用for循环调用第二个批处理文件进行处理,将第二个文件传递给基本名称.

根据for /?help,basename可以使用nifty~n选项提取.所以,基本脚本会读取:

for %%f in (*.in) do call process.cmd %%~nf
Run Code Online (Sandbox Code Playgroud)

然后,在process.cmd中,假设%0包含基本名称并相应地执行操作.例如:

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt
Run Code Online (Sandbox Code Playgroud)

在一个脚本中可能有更好的方法可以做到这一点,但对于如何在批处理文件中的单个for循环中提取多个命令,我总是有些模糊.

编辑:太棒了!我在某种程度上错过了文档中的页面,该页面显示您可以在FOR循环中执行多行块.我现在要回去重写一些批处理文件了......