我不会在带有参数的相应行之前指定名称,而是在它们之后。如果名称在前,则处理将更加复杂:您需要检查它是否是第一行,因为如果不是,您首先需要使用先前存储的名称来合并待处理的输出文件,并且只然后存储新名称。此外,当您到达末尾时data.txt
,将没有name of file
行来触发最后一组输出项的合并。相反,如果名称在参数之后,您只需在那里使用它,然后,您甚至不需要存储它。
可能你可以这样做:
存储%%A
在变量中。
尝试name of file:
从存储的值中删除(使用set var=!var:substr=!
语法)。
将结果值与 进行比较%%A
。
如果两个值保持相同,则 中没有name of file:
子字符串%%A
,这意味着它是参数列表行,而不是文件名行。(我希望你永远不要将该签名字符串用作参数集。)在这种情况下,
- 只需调用 .exe 文件来处理参数,就像你现在正在做的那样。
如果结果不同,则该行包含名称。所以,
如果不是名字,则使用先前存储的名称处理输出文件;
存储刚刚获得的名称以备后用;
设置一个标志,表明后面的名字不会是第一个。
在循环之后,如果设置了标志,则处理旧名称。
以下是我实施上述步骤列表的尝试:
SETLOCAL EnableDelatedExpansion
SET NotTheFirstName=
FOR /F "tokens=*" %%A IN (data.txt) DO (
SET "name=%%A"
SET "name=!ext:name of file: =!"
IF "!name!"=="%%A" (
XYZ.exe %%A
) ELSE (
IF DEFINED NotTheFirstName (
do whatever you need with !oldname!
to process your output files
)
SET "oldname=!name!"
SET NotTheFirstName=1
)
)
do whatever you need with !oldname! once again
(to account for the last set of output files)
请注意,如果data.txt
格式如下:
abc 1 2
xyz 2 3
name of file: mp3
sss 1 2
rrr 2 3
name of file: mp4
eee 1 2
qqq 2 3
name of file: vob
即,如果文件名行位于它所属的参数行之后,则脚本会简单得多:
SETLOCAL EnableDelatedExpansion
FOR /F "tokens=*" %%A IN (data.txt) DO (
SET "name=%%A"
SET "name=!ext:name of file: =!"
IF "!name!"=="%%A" (
XYZ.exe %%A
) ELSE (
do whatever you need with !name!
to process your output files
)
)
如您所见,没有必要存储名称以供以后迭代使用,因为输出只是在那里处理的。因此,在循环之后不需要任何标志或再次使用名称。