批处理文件中的循环和“存在”

3
我很难理解以下批处理脚本的内容:
@echo off
echo b>b.txt
for /f %%A in ('echo b.txt b.txt') do (
    echo %%A
    if not exist %%A (
        echo does not exist.
    ) else (
        echo %%A exist.
    )
)

首先,我确保“b.txt”文件存在,然后期望循环输出该文件的名称两次,并确认它存在。然而,实际输出结果是:

b.txt
does not exists

有人能解释一下这种行为吗?

这段代码对我来说是有效的 - 试着运行它,看看 b.txt 是否已经被创建了? - Karl Barker
我尝试过,但结果对我来说并没有改变。你有什么想法吗?为什么我的设置会出现问题呢? - goldfish
我已经在Win7-x64和XP上尝试过它,它可以工作! - jeb
也适用于我的电脑... 有一个需要注意的地方,如果你想让循环执行两次,输出需要在不同的行上(for /f 如果没有另外指示只会取第一个标记),所以你需要这样做: 'echo b.txt ^& echo b.txt' - wmz
2个回答

3

建议您尝试将文件名分配给变量,以确保在两个语句中引用的是完全相同的内容,例如:

set file=b.txt
echo b>%file%
for /f %%A in ('echo %file% ^& echo %file%') do (
    echo [%%A]
    if  not exist %%A (
        echo [%%A] does not exist.
    ) else (
        echo [%%A] exist.
    )
)

我还去掉了echo off,这样你就可以看到扩展输出,并在%%A周围加上括号以查看它的边界。

编辑:一些额外的故障排除:
我可能会从命令行开始构建脚本,只更改一个事情,并查看它在哪里中断。

if b.txt存在则echo Exists

如果它可行,则

for /f %A in ('echo whatever') if b.txt存在则echo Exists

等等,一直到

for /f %A in ('echo b.txt ^&echo b.txt') do (if exist %A (echo %A exists) else (echo not exists))

您也可以使用variant(尽管我看不出它有什么区别):

for %A in (b.txt b.txt) do (if exist %A (echo %A存在) else (echo 不存在))


谢谢,但这段代码对我仍然不起作用。在第一次迭代中,我得到 [b.txt]不存在 的信息,而在第二次迭代中则是 [b.txt]存在。无论我执行脚本的次数有多少,或者 b.txt 是否事先存在,情况都是如此。我的操作系统是 Windows 7 x64。你有任何想法为什么会出现这种奇怪的行为,或者我该尝试什么来找到问题吗? - goldfish
非常奇怪...我无法复制它。也许你可以将 echo 更改为 dir /b?这样,您就可以确保此文件在第一次运行时可用于您的批处理文件。 - wmz
类似的结果,脚本打印出第一个文件不存在(尽管它明显存在),而所有后续文件都存在。为什么第一次迭代不同? - goldfish
@goldfish 这应该没有什么不同... 我会编辑答案并包含一些额外的信息。 - wmz
谢谢提供额外的例子:除了完整的代码之外,一切都正常工作。特别是,如果我直接使用“b.txt”(而不是变量),则它可以工作;不同的for循环变体也可以(甚至带有变量);独立的if语句也可以工作。我感到困惑,有什么想法吗? - goldfish
显示剩余3条评论

1
这是一篇旧帖子,我知道,但由于Ansicon的原因,问题出现了?如果没有那个程序,我会像你最初发布的帖子一样得到相同的结果,正确的解释是,如果你想让它回显所有的单词,那么似乎需要指定令牌,因为每个回显的单词都将是一个令牌,而不指定令牌数量,它只会回显第一个令牌。在下面的FOR / F语句中添加“tokens=*”
@echo off
echo b>b.txt
for /f "tokens=*" %%A in ('echo b.txt b.txt') do (
    echo %%A
    if not exist %%A (
        echo does not exist.
    ) else (
        echo %%A exist.
    )
)

这将产生这个:

echo b.txt b.txt
does not exist.

因此,它永远不会找到名为“b.txt b.txt”的文件,因为这就是%%A将要转换的内容。 但是,如果目标是在echo之后回显所有单词并检查b.txt的存在,则这将起作用。

@echo off
echo b>b.txt
for /f "tokens=*" %%A in ('echo b.txt b.txt') do (
    echo %%A %%B
    if not exist %%A (
        echo does not exist.
    ) else (
        echo %%A exist.
    )
)

我从上面得到的输出是这样的:
b.txt b.txt
b.txt exist.

我不确定这个脚本的目的是什么,所以也许这并没有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接