2

我有一个 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。我想现在应该很清楚了。请让我知道更多说明..

4

1 回答 1

1

我不会在带有参数的相应行之前指定名称,而是它们之后。如果名称在前,则处理将更加复杂:您需要检查它是否是第一行,因为如果不是,您首先需要使用先前存储的名称来合并待处理的输出文件,并且只然后存储新名称。此外,当您到达末尾时data.txt,将没有name of file行来触发最后一组输出项的合并。相反,如果名称在参数之后,您只需在那里使用它,然后,您甚至不需要存储它。

可能你可以这样做:

  1. 存储%%A在变量中。

  2. 尝试name of file: 从存储的值中删除(使用set var=!var:substr=!语法)。

  3. 将结果值与 进行比较%%A

  4. 如果两个值保持相同,则 中没有name of file: 子字符串%%A,这意味着它是参数列表行,而不是文件名行。(我希望你永远不要将该签名字符串用作参数集。)在这种情况下,

    • 只需调用 .exe 文件来处理参数,就像你现在正在做的那样。
       
  5. 如果结果不同,则该行包含名称。所以,

    • 如果不是名字,则使用先前存储的名称处理输出文件;

    • 存储刚刚获得的名称以备后用;

    • 设置一个标志,表明后面的名字不会是第一个。

  6. 在循环之后,如果设置了标志,则处理旧名称。

以下是我实施上述步骤列表的尝试:

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
  )
)

如您所见,没有必要存储名称以供以后迭代使用,因为输出只是在那里处理的。因此,在循环之后不需要任何标志或再次使用名称。

于 2012-10-05T15:14:39.167 回答