使用批处理脚本将命令输出到文件

3

我正在尝试生成一个XML文件。我使用一个命令比较两张图片,该命令会返回一个数字。但是当我尝试将其输出重定向到文件时,它会在数字后面打印一个换行符。

        echo a.jpg >> "result.txt"
        compare -metric NCC "a.jpg" "b.jpg" "c.jpg" 2>> "result.txt"

期望输出如下:

        a.jpg 1

但是它的输出结果是:
        a.jpg
        1

我尝试从命令中获取结果,并尝试将其与a.jpg连接起来,但我无法成功。

        for /f "tokens=1 delims=" %%a in ('compare -metric NCC "a.jpg" "b.jpg" "c.jpg"') do set result=%%a
        echo %result% 
        REM outputs 1ECHO is off.

for /f "tokens=1 delims=" %%a in ('compare -metric NCC "a.jpg" "b.jpg" "c.jpg"') do echo test %%a 这段代码的意思是什么? - Stephan
它说1ECHO已关闭,但这意味着结果变量没有被正确初始化,对吗? - ozcanovunc
只有一行输出?我希望有两行。 - Stephan
是的。只有一行代码。链接 - ozcanovunc
抱歉,我测试了错误的代码。你的代码只输出1。但是当我删除test %%a部分时,输出结果仍然相同,这很有趣。 - ozcanovunc
2个回答

2

第一个命令可以添加换行符。如果想要避免这种情况并且在一行中获取输出,请按照以下方式使用。

echo|set /p=a.jpg >> "result.txt"

2

现在我知道发生了什么:

compare -metric NCC "a.jpg" "b.jpg" "c.jpg" 2>> "result.txt"

你想要的输出在 STDERR 上,而不是 STDOUT(非常不寻常)。但是 for 只捕获 STDOUT。

应该可以调整 for 结构,但更简单的方法是使用:

<nul set /p "=a.jpg " >> "result.txt"
REM this line writes a string without linefeed

compare -metric NCC "a.jpg" "b.jpg" "c.jpg" 2>> "result.txt"
REM this line appends the STDERR of the "compare" command to the line

这个可以用,但是为什么需要使用<nul,使用它的目的是什么?(顺便说一下,我是新手批处理编程) - ozcanovunc
1
set /p 的目的是要求用户输入。我们误用它来输出一行没有换行符的文本; 为了模拟空用户输入,我们将 NUL 设备重定向到它。尝试 set /p "x=请输入:",您会注意到,您的输入保持在同一行,紧跟在“请输入”提示之后。这有点像作弊,但效果很好,而且通常被使用。 - Stephan

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