批处理文件中的for循环正在从文件中错误地读取输入 - 循环失败

时间:2013-09-13 03:32:38

标签: windows shell loops batch-file

我有一个for循环读取来自名为“temp”的文件中的行。它应该读取每一行,然后继续为文件中的每个名称创建一个目录。但是,它在移动到第二行之前读取文件的第一行两次。所以我得到一个错误,说文件夹已经存在。

目前,文件“temp”包含两个条目:

folder1 
folder2

代码很简单:

for /F "tokens=*" %%i in  (temp) do  (
    set pstname=%%i
    echo the folder name is set to  %pstname%
    mkdir C:\output\%pstname%
)

当我运行它时,它会从“temp”文件中读取第一行 folder1 ,并创建目录 c:\ output \ folder1 。所以我希望在下一次迭代中,变量 pstname 将被设置为“temp”文件中的第二行(应该设置为 folder2

但事实并非如此。循环读取 fodler1 两次并尝试再次创建 folder1 文件夹。如果我继续使用该脚本,它最终会从“temp”文件( folder2 )中读取第二行并创建它。所以脚本几乎可以工作。

问题:我做错了什么?它在进入下一行之前两次读取文件“temp”中的第一行?

我必须使用下一个命令吗?我的逻辑出了什么问题?

1 个答案:

答案 0 :(得分:2)

再看一遍。第二个目录未创建。

您是“延迟扩张”问题的受害者。从FOR到结束括号的ENTIRE命令被解析,并且在那时,任何%var%被替换为var的值,因为它在该行为PARSED时。只有这样才行EXECUTED。

因此,运行你的codefrag一次,并且当时pstname用作目标目录名 - 可能是空的(没有你剩下的代码,没有办法告诉。)

因此执行的内容(假设pstname为空)

for /F "tokens=*" %%i in  (temp) do  (
    set pstname=%%i
    echo the folder name is set to
    mkdir C:\output\
)

但是pstname将从文件的最后一行获取名称。

如果您再次运行代码而不先清除pstname,那么您将获得

for /F "tokens=*" %%i in  (temp) do  (
    set pstname=%%i
    echo the folder name is set to  folder2
    mkdir C:\output\folder2
)

将执行两次 - temp中的每一行一次 - 并创建该目标。

这个问题有很多关于SO的参考资料。最简单的治疗方法是

for /F "tokens=*" %%i in  (temp) do  (
    echo the folder name is set to  %%i
    mkdir "C:\output\%%i"
)

(注意兔子的耳朵周围要创建的名称 - 占名称中的空格)