亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在bat腳本中回顯控制臺輸出并將其發送到文件?

如何在bat腳本中回顯控制臺輸出并將其發送到文件?

繁花如伊 2019-11-25 10:34:07
我有一個執行任務的批處理腳本,并將輸出發送到文本文件。有沒有辦法在控制臺窗口上也顯示輸出?例如:c:\Windows>dir > windows-dir.txt有沒有辦法dir在控制臺窗口中顯示輸出并將其輸出到文本文件中?
查看完整描述

3 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

不,您不能使用純重定向。

但是,您可以使用一些技巧(例如tee.bat)。


我嘗試解釋一下重定向。


使用> file或<file重定向十個流之一。

如果重定向是在命令之前還是之后,則這并不重要,因此這兩行幾乎相同。


dir > file.txt

> file.txt dir

在此示例中,重定向只是1>的快捷方式,這意味著將對流1(STDOUT)進行重定向。

因此,您可以在任何流之前添加數字,例如2> err.txt,也可以在一行中重定向多個流。


dir 1> files.txt 2> err.txt 3> nothing.txt

在此示例中,“標準輸出”將進入files.txt,所有錯誤都將在err.txt中,stream3將進入nothing.txt(DIR不使用流3)。

Stream0是STDIN

Stream1是STDOUT Stream2

是STDERR

Stream3-9未使用


但是,如果您嘗試多次重定向同一流,會發生什么情況?


dir > files.txt > two.txt

“只能有一個”,它永遠是最后一個!

因此等于dir> two.txt


好的,還有一種可能,將一個流重定向到另一個流。


dir 1>files.txt 2>&1 

2>&1將stream2重定向到stream1,而1> files.txt將所有都重定向到files.txt。

這里的順序很重要!


dir ... 1>nul 2>&1

dir ... 2>&1 1>nul

是不同的。第一個將所有(STDOUT和STDERR)重定向到NUL,

但是第二行將STDOUT重定向到NUL,將STDERR重定向到“空” STDOUT。


作為一個結論,很明顯為什么OtávioDécio和andynormancx的示例無法正常工作。


command > file >&1

dir > file.txt >&2

兩者都嘗試將stream1重定向兩次,但是“只能有一個”,并且始終是最后一個。

所以你得到


command 1>&1

dir 1>&2

并且在第一個示例中,不允許將stream1重定向到stream1(并且不是很有用)。


希望能幫助到你。


查看完整回答
反對 回復 2019-11-25
?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

是的,有一種方法可以在控制臺(屏幕)和文件中顯示單個命令輸出。使用您的示例,使用...


@ECHO OFF

FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txt

詳細說明:


該FOR命令將命令或文本的輸出解析為變量,可以多次引用該變量。


對于諸如的命令,請DIR /B用單引號引起來,如下例所示。將DIR /B文本替換為所需的命令。


FOR /F "tokens=*" %%I IN ('DIR /B') DO ECHO %%I & ECHO %%I>>FILE.TXT

要顯示文本,請用雙引號引起來,如下例所示。


FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ECHO %%I & ECHO %%I>>FILE.TXT

...以及換行...


FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO (

  ECHO %%I & ECHO %%I>>FILE.TXT

)

如果您有時只希望在控制臺(屏幕)上輸出,而有時只希望將輸出發送到文件,而有時又希望同時發送給兩個文件,請使用變量指定FOR循環的“ DO”子句,如下所示%TOECHOWHERE%。


@ECHO OFF

FOR %%I IN (TRUE FALSE) DO (

  FOR %%J IN (TRUE FALSE) DO (

    SET TOSCREEN=%%I & SET TOFILE=%%J & CALL :Runit)

)

GOTO :Finish


:Runit

  REM Both TOSCREEN and TOFILE get assigned a trailing space in the FOR loops

  REM above when the FOR loops are evaluating the first item in the list,

  REM "TRUE".  So, the first value of TOSCREEN is "TRUE " (with a trailing

  REM space), the second value is "FALSE" (no trailing or leading space).

  REM Adding the ": =" text after "TOSCREEN" tells the command processor to

  REM remove all spaces from the value in the "TOSCREEN" variable.

  IF "%TOSCREEN: =%"=="TRUE" (

      IF "%TOFILE: =%"=="TRUE" (

          SET TEXT=On screen, and in "FILE.TXT"

          SET TOECHOWHERE="ECHO %%I & ECHO %%I>>FILE.TXT"

        ) ELSE (

          SET TEXT=On screen, not in "FILE.TXT"

          SET TOECHOWHERE="ECHO %%I"

      )

    ) ELSE (

      IF "%TOFILE: =%"=="TRUE" (

          SET TEXT=Not on screen, but in "FILE.TXT"

          SET TOECHOWHERE="ECHO %%I>>FILE.txt"

        ) ELSE (

          SET TEXT=Not on screen, nor in "FILE.TXT"

          SET TOECHOWHERE="ECHO %%I>NUL"

      )

  )

  FOR /F "tokens=*" %%I IN ("%TEXT%") DO %TOECHOWHERE:~1,-1%

GOTO :eof


:Finish

  ECHO Finished [this text to console (screen) only].

  PAUSE


查看完整回答
反對 回復 2019-11-25
  • 3 回答
  • 0 關注
  • 3778 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號