TL; DR;
在Win上的CMD批处理文件中-如何同时/连续地向文件和屏幕同时添加/打印完整循环输出?
长版:
我知道这更像是powershell / bash任务,或者通常更适合* nix /管道,但是由于某些原因,我需要在win(7!)batch / cmd上执行该操作。
我有一个有点被黑的超级简单小原始循环(在win 7上),它带有一些网络任务,每隔x秒检查一次(本地)DNS列表更新,刷新本地DNS,然后再次检查传播情况。从赢到后来被另一个脚本解析。
@echo off
set "domain=mydomain.TLD"
set "dns_host=dnshost.TLD"
set "NS1=ns1.dnshost.TLD"
set "NS2=ns1.dnshost.TLD"
set "neutralDNS=8.8.8.8"
set "timeout=60"
set "outputfile=myfile.txt"
FOR /L %%A IN (1,1,200) DO (
ECHO ************************************************
ECHO ********* Checking %domain% On %NS1% // %NS2%
ECHO ************* Loop Count :: %%A %Time%
ipconfig /flushdns
timeout %timeout%
ping %domain%
ping %dns_host%
ping %NS1%
ping %NS2%
nslookup %domain% %neutralDNS%
nslookup %dns_host% %NS1%
nslookup ns1.%dns_host%
REM ... Loop goes on here, commands are not really important
REM host %dns_host%// we are not on *nix !
REM dig %dns_host% @%neutralDNS% // we are not on *nix !
)
我想将循环的输出附加到文件和屏幕上,但是当我尝试用>> myfile.txt
附加输出时:
FOR /L %%A IN (1,1,200) DO (
ECHO ************* Loop Count :: %%A %Time%
......
) >> %outputfile%
执行完全失败,并且当我尝试使用> myfile
输出到文件时:
FOR /L %%A IN (1,1,200) DO (
ECHO ************* Loop Count :: %%A %Time%
......
) > %outputfile%
文件每次迭代都会覆盖自身。
另一个问题是,除了显式回声之外,这两种情况都没有屏幕输出。
答案 0 :(得分:1)
根据@Stephan注释和poor's man solution(或original code)的实现,其中包括创建一个临时文件,然后type
行写在该临时文件中。可以正常工作的代码可以写为
.
.
.
set "outputfile=myfile.txt"
::Poor's man solution
set "display=> _ & type _ & type _ >> %outputfile%"
FOR /L %%A IN (1,1,200) DO (
ECHO ************************************************ %display%
ECHO ********* Checking %domain% On %NS1% // %NS2% %display%
ECHO ************* Loop Count :: %%A %Time% %display%
::Simple test
ping 127.0.0.1 %display%
.
.
.
)
del /q /f _
循环结束后,我们应该del
/ erase
临时文件。
详细解释
这段代码可以分为三个步骤。首先使用>
将输出重定向到_
,然后将type
的内容重定向到_
,最后将_
的内容附加到%outputfile%
中。由于它是逐行进行的,因此我们仅附加每个命令的结果输出。