对于批处理文件中的循环行为不当

时间:2017-04-24 19:02:06

标签: batch-file for-loop

我只是在学习批处理脚本的过程中尝试简单的循环。

for /f "tokens=* delims= " %%a in (abc.txt) do echo %%a

我的abc.txt conatins

word1 word2 word3

现在输出应该是这样的

word1
word2
word3

但我只是得到一行而不是三行。为什么?我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

有很多方法可以实现这一目标:

@Echo off
Echo Variant 1
for /f "tokens=1-3" %%a in (abc.txt) do echo %%a & echo %%b & echo %%c
Echo Variant 2
For /f "tokens=*" %%a in (abc.txt) do for %%B in (%%a) Do Echo %%B
Echo Variant 3
For /f "tokens=*" %%a in ('type abc.txt') do for %%B in (%%a) Do Echo %%B

示例输出:

Variant 1
word1
word2
word3
Variant 2
word1
word2
word3
Variant 3
word1
word2
word3

答案 1 :(得分:2)

命令for /f在每次迭代时逐行处理文本文件abc.txt。跳过空行以及以分号开头的行,因为eol=;是默认值。

根据tokens=delims= FOR 处理所有其他行。

如果abc.txt只包含一行word1 word2 word3,则命令 FOR 会将此行拆分为分配给循环变量的子串(标记)。分割将使用delims= (只是空格字符)完成,如下所示:

  1. word1已分配给 FOR 命令行中指定的循环变量a
  2. word2根据ASCII table分配给下一个循环变量b,这就是为什么循环变量区分大小写与环境变量不区分大小写的原因。
  3. word3被分配给下一个但只有一个循环变量c
  4. 使用tokens=可以将子字符串更改为循环变量赋值顺序。例如,tokens=2第一个子字符串word1被忽略,第二个word2被分配给循环变量a,第三个word3被再次忽略。仅忽略1个空格分隔字符串的行也将被忽略,因为不能将至少1个子字符串分配给指定的(第一个)循环变量。该行必须至少有2个空格分隔的字符串tokens=2,用于在循环体中运行命令。

    tokens=1*表示将word1分配给a以及第一个子字符串到下一个循环变量b后的所有内容,而不进行进一步拆分,从而将word2 word3分配给循环变量{ {1}}。

    b表示根本不拆分该行。所以tokens=*没有效果。

    delims= 在一行上有3个单词的任务需要两个循环,并且循环体中的命令应该在每行的每个单词上执行:

    abc.txt

    外部循环从文本文件@echo off for /F "delims=" %%I in (abc.txt) do ( echo Line: %%I for %%J in (%%I) do echo %%J ) 中读取不以分号开头的非空行,并将整行分配给循环变量abc.txt

    没有选项I的内部循环使用标准分隔符来处理此行,使用 FOR 而不使用/F,其中包括空格,制表符,逗号和其他一些内容。< / p>

    文件/F中单行中word1 word2 word3的此批处理文件的输出为:

    abc.txt

    顺便说一句:在命令提示符窗口Line: word1 word2 word3 word1 word2 word3 中运行在几个显示页面上输出该命令的帮助。由于存在大量变体,for /?的行为确实是最难理解的。

答案 2 :(得分:-2)

尝试以下版本之一:

版本1(将该单词放入文件中,然后在屏幕上显示,以及回显的内容):

ssh yourhost "$cmd"

第2版:

         @echo off
         title text file reader/writer
         echo This version inputs text that is predefined in the source code into a .txt file.
         echo oh hey! I am text line 1>testwords.txt
         echo oh hey! I am text line 2>>testwords.txt
         echo oh hey! I am text line 3>>testwords.txt
         echo oh hey! I am text line 4>>testwords.txt
         echo Text entered! displaying below!
         type testwords.txt
         pause
         del testwords.txt
         exit

第3版:

         @echo off
         title text file reader/writer
         echo This version displays predefined text in the source code as an "echo"
         echo oh hey! I am text! 
         pause
         exit

第4版:

         @echo off
         title text Displayer
         echo This version displays User Entered text as an "echo" via the "set" command.

         set /p text=Enter text here:
         echo You have entered: %text%
         pause
         exit