【问题标题】:Batch command to use the first line of txt file to create a file批处理命令使用txt文件的第一行创建文件
【发布时间】:2012-10-04 14:15:30
【问题描述】:

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

【问题讨论】:

  • 由于我们不知道您的xyz 程序如何接受输出文件名,因此我们无法在此为您提供帮助。我不得不把这个问题读了四遍左右才能知道你在尝试什么。
  • XYZ 程序只取三个参数并返回一个文件。这不是真正的问题。我只需要在生成的文件中附加扩展名。问题是我们如何检测到 data.txt 文件中有一个新的文件名,我们需要停止处理进一步的命令,只需将此扩展名附加到生成的文件中。
  • 好的,我已经编辑了我的查询,以便通过示例进行清晰的查询。希望对您有所帮助..!

标签: batch-file


【解决方案1】:

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

也许你可以这样做:

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

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

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

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

    • 只需调用 .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
  )
)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多