我在Windows文件中有这个脚本,它可以做我想做的事情。它还显示并记录其输出,但显然该脚本中使用的程序的输出没有显示,也没有按顺序登录。请参见下面的脚本和输出。
@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输出:
****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:出现在顶部,而不是在日志文件中。它们似乎没有被附加到输出变量中。
程序是否在没有等待它完成的情况下执行一个又一个命令?这似乎是异步行为。
发布于 2015-12-24 14:44:10
标准输出消息有stdout,错误消息有stderr。
Non-authoritative answer是一条写入stderr的错误消息。
命令用于进程,默认情况下只有写入stdout的消息。
这样做可能要容易得多,可以将使用命令重定向运算符和stdout和stderr直接重定向到日志文件,而不是收集环境变量中的所有消息行,最后将环境变量的值写入日志文件。
但是,将 of nslookup重定向到每个for循环中的stdout,使用带有转义角括号和符号的2>&1和^使2>&1应用于E 127nslookupE 228而不是命令E 129用于E 230,这将解决您的问题。
@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直接重定向到日志文件的代码。
@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 /khttps://stackoverflow.com/questions/34431972
复制相似问题