如何将文件内容作为参数批处理文件

时间:2016-05-17 13:46:30

标签: batch-file io

我想读取存储在一系列.txt文件中的值(格式相同),作为参数跟随另一个命令。

@ECHO OFF
FOR /F "tokens=1,2,3 delims=    " %%A IN ( TestName.txt ) DO CALL :Process %%A %%B %%C
:Process
ECHO [1] = "%1"
ECHO [2] = "%2"
ECHO [3] = "%3"
GOTO :eof

一切正常,当IN(...)直接引用单个文本文件时(最后一个空运行除外)。 结果:

[1] = "TestValue11"
[2] = "TestValue21"
[3] = "TestValue31"
[1] = "TestValut12"
[2] = "TestValue22"
[3] = "TestValue32"
[1] = ""
[2] = ""
[3] = ""

TestName.txt看起来像:

TestValue11 TestValue21 TestValue31
TestValut12 TestValue22 TestValue32

但是当我想设置一个放在另一个目录而不是%~dp0的TestName.txt的路径时,让我们说“输入”,只有filname被作为第一个参数。循环不再进入文件。

我已尝试将IN ( )路径放置如下:

IN ("%~dp0input\*.txt")

IN ('DIR /A-D /B "%~dp0input\*.txt"')

你能帮助我让这个循环更有用吗,可以重写多个文件中的值吗?

2 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题:

  1. GOTO :eof循环后没有FOR /F,因此在完成循环后无意中落入:Process例程。
  2. 您应该在CALL :Process的参数周围加上引号,因为 SPACE TAB ,;等字符和=被视为分隔符。您可以稍后使用:Process~修饰符在%~1子例程中删除这些引号。
  3. 由于文件路径和名称可能包含空格,因此应将它们用引号""括起来。 FOR /F将引用的字符串视为文字字符串而不是文件名,除非您提供选项字符串usebackq
  4. FOR /F不支持*?等通配符,因此当您指定*.txt时,FOR /F会尝试查找名为{{1}的文件当然,这是无法找到的。为了解决这个问题,您可以使用支持通配符的标准*.txt循环。
  5. 这是固定的脚本:

    FOR

答案 1 :(得分:1)

您的FOR / F无需解析各个参数,因为您只需将它们全部重新组合在一起。

即使您想要解析它们,也很难做到,因为FOR / F解析令牌的规则与命令行解析器的工作方式完全不同。

以下应该是您所需要的:

@echo off
for /f delims^=^ eol^= %%A IN ( TestName.txt ) do call :Process %%A
exit /b

:Process
echo [1] = "%1"
echo [2] = "%2"
echo [3] = "%3"
exit /b

奇怪的DELIMS和EOL语法有效地禁用了两个选项,因此每个整行都被保留。

正如其他人指出的那样,FOR循环后需要EXIT / B(或GOTO:EOF)。