batch file中的循环正在从文件读取错误的input – 循环失败

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

目前,文件“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 ,并创build目录c:\ output \ folder1 。 所以我期望在下一次迭代中,variablespstname将被设置为“temp”文件中的第二行(应该设置为folder2

但是那不是发生了什么。 该循环读取两次fodler1并尝试再次创buildfolder1文件夹。 如果我继续使用脚本,它最终会从“temp”文件( folder2 )中读取第二行并创build它。 所以脚本几乎可以工作。

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

有没有我必须使用的下一个命令? 我的逻辑有什么问题?

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

你是“延期扩张”问题的受害者。 从FOR到结束圆括号的ENTIRE命令被解析,并且当时,任何%var%都被var的值代替,就像在PARSED那一行那样。 只有这样才行EXECUTED。

因此,运行你的codefrag一次,而pstname站在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行 – 并创建该direcory。

对这个问题有很多的参考文献。 最简单的治疗方法是

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

(注意兔子的耳朵周围的名字将被创建 – 占名字空间)