当前位置:  开发笔记 > 前端 > 正文

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

如何解决《如何在批处理文件中循环匹配通配符的文件》经验,为你挑选了3个好方法。

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

显示基本名称'f'

对'f.in'执行操作

对'f.out'执行另一个操作

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



1> Jim Buck..:

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

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

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


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

2> Mark Ingram..:

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

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 

一旦你有%%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]

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

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


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

3> Nathan Fritz..:

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

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

for %%f in (*.in) do call process.cmd %%~nf

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

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt

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

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

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有