我想读取存储在一系列.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"')
你能帮助我让这个循环更有用吗,可以重写多个文件中的值吗?
答案 0 :(得分:1)
您的代码中存在一些问题:
GOTO :eof
循环后没有FOR /F
,因此在完成循环后无意中落入:Process
例程。CALL :Process
的参数周围加上引号,因为 SPACE , TAB ,,
,;
等字符和=
被视为分隔符。您可以稍后使用:Process
等~
修饰符在%~1
子例程中删除这些引号。""
括起来。 FOR /F
将引用的字符串视为文字字符串而不是文件名,除非您提供选项字符串usebackq
。FOR /F
不支持*
和?
等通配符,因此当您指定*.txt
时,FOR /F
会尝试查找名为{{1}的文件当然,这是无法找到的。为了解决这个问题,您可以使用支持通配符的标准*.txt
循环。这是固定的脚本:
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)。