echo foo 1>foo.txt C:\>type foo.txt foo-6ren">
gpt4 book ai didi

batch-file - 我们如何使用 Windows 批处理脚本将以 "1"结尾的行写入文件?

转载 作者:行者123 更新时间:2023-12-03 16:54:20 28 4
gpt4 key购买 nike

简短的问题

我如何回显字符串 "foo 1"echo命令同时将其输出重定向到文件,以便将整个字符串写入文件?

C:\>echo foo 1>foo.txt

C:\>type foo.txt
foo

C:\>xxd -g1 a.txt
0000000: 66 6f 6f 20 0d 0a foo ..

上面的实验表明只有 "foo "被写入文件,因为 "1"在命令中被解释为重定向操作符的一部分, 1> .请注意 echo foo 1 > foo.txt不是解决方案,因为它会写 "foo 1 "到字符串中带有不必要的尾随空格的文件。

长问题

考虑以下 Windows 批处理脚本。
@echo off
call :log "start script"
call :log "foo"
call :log "end script"
goto :eof

:log
echo %~1>>log.txt
goto :eof

当我执行此脚本时,它会按预期运行,即在 log.txt 中写入三行日志。
C:\>foo

C:\>type log.txt
start script
foo
end script

现在考虑以下脚本,其中日志的第二行已被修改为 "foo""foo 1" .
@echo off
call :log "start script"
call :log "foo 1"
call :log "end script"
goto :eof

:log
echo %~1>>log.txt
goto :eof

这引起了一些意外。正如您在下面的输出中看到的,我们看到 "foo"而不是 "foo 1"在日志文件中。
C:\Users\pals3\Desktop>foo

C:\Users\pals3\Desktop>type log.txt
start script
foo
end script

通过删除包含 @echo off 的第一行,很容易理解为什么会发生这种情况。从脚本,然后执行脚本。
C:\>foo.cmd

C:\>call :log "start script"

C:\>echo start script 1>>log.txt

C:\>goto :eof

C:\>call :log "foo 1"

C:\>echo foo 1>>log.txt

C:\>goto :eof

C:\>call :log "end script"

C:\>echo end script 1>>log.txt

C:\>goto :eof

C:\>goto :eof

从这里可以看出,只要有 >>log.txt在脚本中,命令解释器将其替换为同义语法 1>>log.txt .这意味着我们的命令记录 "foo 1"现在执行为 echo foo 1>>log.txt ,它只是写 "foo"到日志文件。

一个简单的解决方案是替换语句 echo %~1>>log.txt在脚本中使用 echo %~1 >>log.txt .
@echo off
call :log "start script"
call :log "foo 1"
call :log "end script"
goto :eof

:log
echo %~1 >>log.txt
goto :eof

然而,这意味着日志的每一行都会以一个空格字符作为后缀,这从学究的角度来看并不理想,并且当人们可能想要使用 grep 过滤日志文件时会有点困惑。
C:\>foo

C:\>type log.txt
start script
foo 1
end script

C:\>xxd -g1 log.txt
0000000: 73 74 61 72 74 20 73 63 72 69 70 74 20 0d 0a 66 start script ..f
0000010: 6f 6f 20 31 20 0d 0a 65 6e 64 20 73 63 72 69 70 oo 1 ..end scrip
0000020: 74 20 0d 0a

有没有办法写 :log子例程的方式,它摆脱了我上面提到的惊喜,而不是在每行日志的末尾写一个额外的空间?

最佳答案

用括号试试:

@echo off
call :log "start script"
call :log "foo 1"
call :log "end script"
goto :eof

:log
(echo %~1)>>log.txt
goto :eof

关于batch-file - 我们如何使用 Windows 批处理脚本将以 "1"结尾的行写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17041938/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com