首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmd /批处理文件未按顺序显示或记录其他程序的输出

cmd /批处理文件未按顺序显示或记录其他程序的输出
EN

Stack Overflow用户
提问于 2015-12-23 09:02:38
回答 1查看 374关注 0票数 0

我在Windows文件中有这个脚本,它可以做我想做的事情。它还显示并记录其输出,但显然该脚本中使用的程序的输出没有显示,也没有按顺序登录。请参见下面的脚本和输出。

代码语言:javascript
复制
@ECHO OFF
:: script global variables 
SET log=nslookup-tests.log

::Logic
set LF=^



REM The two empty lines abive are required!!
set output=****%date% %time% -- NSLOOKUP from anywhere with DNS server from edpnet****
setlocal EnableDelayedExpansion

set output=!output!!LF!!LF!!LF!**youtube.com
set output=!output!!LF!!LF!*edpnet DNS
for /F "delims=" %%f in ('nslookup youtube.com 212.71.0.33') do (
 set output=!output!!LF!%%f
)
set output=!output!!LF!!LF!*google DNS
for /F "delims=" %%f in ('nslookup youtube.com 8.8.8.8') do (
 set output=!output!!LF!%%f
)

set output=!output!!LF!!LF!!LF!**bestofyoutube.com
set output=!output!!LF!!LF!*edpnet DNS
for /F "delims=" %%f in ('nslookup bestofyoutube.com 212.71.0.33') do (
 set output=!output!!LF!%%f
)
set output=!output!!LF!!LF!*google DNS
for /F "delims=" %%f in ('nslookup bestofyoutube.com 8.8.8.8') do (
 set output=!output!!LF!%%f
)

set output=!output!!LF!!LF!!LF!**vidzi.tv
set output=!output!!LF!!LF!*edpnet DNS
for /F "delims=" %%f in ('nslookup vidzi.tv 212.71.0.33') do (
 set output=!output!!LF!%%f
)
set output=!output!!LF!!LF!*google DNS
for /F "delims=" %%f in ('nslookup vidzi.tv 8.8.8.8') do (
 set output=!output!!LF!%%f
)

::output to screen and append to log file
echo !output!
echo !output!!LF!!LF!!LF!!LF! >> "!log!"

::Keep window open
cmd /k

输出:

代码语言:javascript
复制
****wo 23/12/2015    9:46:18,94 -- NSLOOKUP from anywhere with DNS server from edpnet****

Non-authoritative answer:
Non-authoritative answer:
Non-authoritative answer:
Non-authoritative answer:
Non-authoritative answer:
Non-authoritative answer:
****do 24/12/2015 14:49:32,90 -- NSLOOKUP from anywhere with DNS server from edpnet****


**youtube.com

*edpnet DNS
Server:  dns01.edpnet.net
Address:  212.71.0.33
Name:    youtube.com
Addresses:  2a00:1450:4013:c00::5d
    173.194.65.190
    173.194.65.136
    173.194.65.93
    173.194.65.91

*google DNS
Server:  google-public-dns-a.google.com
Address:  8.8.8.8
Name:    youtube.com
Addresses:  2a00:1450:400c:c07::5b
    85.234.204.215
    85.234.204.236
    85.234.204.251
    85.234.204.226
    85.234.204.237
    85.234.204.211
    85.234.204.245
    85.234.204.230
    85.234.204.241
    85.234.204.222
    85.234.204.221
    85.234.204.207
    85.234.204.249
    85.234.204.219
    85.234.204.234


**bestofyoutube.com

*edpnet DNS
Server:  dns01.edpnet.net
Address:  212.71.0.33
Name:    bestofyoutube.com
Address:  104.238.110.149

*google DNS
Server:  google-public-dns-a.google.com
Address:  8.8.8.8
Name:    bestofyoutube.com
Address:  104.238.110.149


**vidzi.tv

*edpnet DNS
Server:  dns01.edpnet.net
Address:  212.71.0.33
Name:    vidzi.tv
Addresses:  46.17.100.122
    46.28.202.183
    82.115.15.12

*google DNS
Server:  google-public-dns-a.google.com
Address:  8.8.8.8
Name:    vidzi.tv
Addresses:  82.115.15.12
    46.28.202.183
    46.17.100.122

输出的顺序有些有序,但是有一堆Non-authoritative answer:出现在顶部,而不是在日志文件中。它们似乎没有被附加到输出变量中。

程序是否在没有等待它完成的情况下执行一个又一个命令?这似乎是异步行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 14:44:10

标准输出消息有stdout,错误消息有stderr

Non-authoritative answer是一条写入stderr的错误消息。

命令用于进程,默认情况下只有写入stdout的消息。

这样做可能要容易得多,可以将使用命令重定向运算符stdoutstderr直接重定向到日志文件,而不是收集环境变量中的所有消息行,最后将环境变量的值写入日志文件。

但是,将 of nslookup重定向到每个for循环中的stdout,使用带有转义角括号和符号的2>&1^使2>&1应用于E 127nslookupE 228而不是命令E 129用于E 230,这将解决您的问题。

代码语言:javascript
复制
@echo off
:: script global variables
set log=nslookup-tests.log

::Logic
set LF=^



REM The two empty lines above are required!!

set output=****%date% %time% -- NSLOOKUP from anywhere with DNS server from edpnet****
setlocal EnableDelayedExpansion

set output=!output!!LF!!LF!!LF!**youtube.com
set output=!output!!LF!!LF!*edpnet DNS
for /F "delims=" %%f in ('nslookup youtube.com 212.71.0.33 2^>^&1') do (
    set output=!output!!LF!%%f
)
set output=!output!!LF!!LF!*google DNS
for /F "delims=" %%f in ('nslookup youtube.com 8.8.8.8 2^>^&1') do (
    set output=!output!!LF!%%f
)

set output=!output!!LF!!LF!!LF!**bestofyoutube.com
set output=!output!!LF!!LF!*edpnet DNS
for /F "delims=" %%f in ('nslookup bestofyoutube.com 212.71.0.33 2^>^&1') do (
    set output=!output!!LF!%%f
)
set output=!output!!LF!!LF!*google DNS
for /F "delims=" %%f in ('nslookup bestofyoutube.com 8.8.8.8 2^>^&1') do (
    set output=!output!!LF!%%f
)

set output=!output!!LF!!LF!!LF!**vidzi.tv
set output=!output!!LF!!LF!*edpnet DNS
for /F "delims=" %%f in ('nslookup vidzi.tv 212.71.0.33 2^>^&1') do (
    set output=!output!!LF!%%f
)
set output=!output!!LF!!LF!*google DNS
for /F "delims=" %%f in ('nslookup vidzi.tv 8.8.8.8 2^>^&1') do (
    set output=!output!!LF!%%f
)

::output to screen and append to log file
echo !output!
echo !output!!LF!!LF!!LF!!LF! >> "!log!"

::Keep window open
%SystemRoot%\System32\cmd.exe /k

下面是将、stderr、stdout直接重定向到日志文件的代码。

代码语言:javascript
复制
@echo off
:: script global variables
set "log=nslookup-tests.log"

(
    echo ****%date% %time% -- NSLOOKUP from anywhere with DNS server from edpnet****
    echo.
    echo.
    echo **youtube.com
    echo.
    echo *edpnet DNS
    %SystemRoot%\System32\nslookup.exe youtube.com 212.71.0.33
    echo *google DNS
    %SystemRoot%\System32\nslookup.exe youtube.com 8.8.8.8

    echo.
    echo **bestofyoutube.com
    echo.
    echo *edpnet DNS
    %SystemRoot%\System32\nslookup.exe bestofyoutube.com 212.71.0.33
    echo *google DNS
    %SystemRoot%\System32\nslookup.exe bestofyoutube.com 8.8.8.8

    echo.
    echo **vidzi.tv
    echo.
    echo *edpnet DNS
    %SystemRoot%\System32\nslookup.exe vidzi.tv 212.71.0.33
    echo *google DNS
    %SystemRoot%\System32\nslookup.exe vidzi.tv 8.8.8.8
    echo.
) >"%TEMP%\%log%" 2>&1

rem Output to screen and append new log to previous log.
type "%TEMP%\%log%"
type "%TEMP%\%log%">>"%log%"
del "%TEMP%\%log%"

::Keep window open
%SystemRoot%\System32\cmd.exe /k
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34431972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档