我有一个bat文件正在读取另一个txt文件,并将值发送到外部exe文件,该文件使用这些命令生成输出文件。
for /f "tokens=*" %%A in (data.txt) do (
:start
XYZ.exe %%A )
和data.txt的内容是这样的:
abc 1 2
xyz 2 3
现在,我正在编辑data.txt,如下所示:
name of file: mp3
abc 1 2
xyz 2 3
name of file: mp4
sss 1 2
rrr 2 3
name of file: vob
eee 1 2
qqq 2 3
我需要使用File的名称来创建一个文件,其中包含每次追加到最后一个时所提到的扩展名。
编辑:
我主要需要找到一种方法,每次它都可以将文件名的值保存在变量中。因此,例如在上面的文本文件中,当我运行批处理时,它将查看文件的名称是否存在。如果它存在,那么它将保存值,即上述情况下的mp3并保存,然后调用XYZ.exe,直到文件名不再出现。一旦新的文件名出现,一个方法将调用,它将合并由XYZ生成的两个输出形成两个参数,并将它们合并到一个文件中,并用mp3添加该文件的扩展名。
然后,新文件名将再次保存在同一个变量中并继续进行。
如果data.txt中没有此文件名的单个实例,则扩展名将为结果文件的txt。我认为现在应该很清楚。请让我知道更多说明..
答案 0 :(得分:1)
我会在之前指定名称带参数的相应行,但之后指定。如果名称先行,则处理将变得更复杂:您需要检查它是否是第一行,因为如果不是,则首先需要使用先前存储的名称来合并待处理的输出文件然后存储新名称。此外,当您到达data.txt
的末尾时,将没有name of file
行来触发最后一组输出项的合并。相反,如果名字在params之后,你只需在那里使用它,然后你甚至不需要存储它。
也许你可以这样做:
将%%A
存储在变量中。
尝试从存储的值中删除name of file:
(使用set var=!var:substr=!
语法)。
将结果值与%%A
进行比较。
如果两个值保持相同,则name of file:
中没有%%A
子字符串,这意味着它是参数列表行,而不是文件名行。 (我希望你不会将该签名字符串用作参数集。)在这种情况下,
如果值结果不同,则该行包含名称。因此,
如果它不是名字,请使用以前存储的名称处理输出文件;
存储刚刚获得的名称供以后使用;
设置一个标志,指示以下名称不是第一个名称。
循环后,如果设置了标志,则处理旧名称。
以下是我尝试实施上述步骤列表:
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
)
)
正如您所看到的,不需要存储名称以便在以后的迭代中使用,因为输出只是在那里处理。因此,不需要任何标志或在循环之后再次使用该名称。