我有一组基本文件名,每个名称'f'都有两个文件,'f.in'和'f.out'.我想编写一个批处理文件(在Windows XP中),它通过所有文件名,每个文件名应该:
显示基本名称'f'
对'f.in'执行操作
对'f.out'执行另一个操作
除了搜索*.in(或*.out)之外,我没有办法列出基本文件名集.
假设您有两个程序来处理这两个文件: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(页面中间)或下一个答案中的其他修饰符.
您可以使用此行打印桌面内容:
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 /?
我认为,最简单的方法是使用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循环中执行多行块.我现在要回去重写一些批处理文件了......