我有一个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”中的第一行?
我必须使用下一个命令吗?我的逻辑出了什么问题?
答案 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"
)
(注意兔子的耳朵周围要创建的名称 - 占名称中的空格)