web-dev-qa-db-ja.com

バッチファイル内からの出力のリダイレクト

システムから情報を収集するための簡単なコマンドでバッチファイルを作成しています。バッチファイルには、時間、IP情報、ユーザーなどを取得するためのコマンドが含まれています。

すべてのコマンドをバッチファイルにまとめて実行しましたが、実行時にバッチファイルを実行して結果をテキストファイル(ログ)に出力します。そうすることができる私がバッチに追加できるコマンドがありますか?

Cmdからバッチを実行してから出力をリダイレクトしたくないということを忘れないでください。可能であれば、出力をバッチ内からリダイレクトしたいのですが。

90
user3085030

単純で素朴な方法では、ファイルポインタを複数回開いてファイルの終わりを指す位置に置くため、処理が遅くなります。

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

より良い方法 - ファイルが一度だけ開かれ配置されるため、書き込みが簡単になり、高速になります。

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

ファイルを1回だけ開いて配置するもう1つの優れた方法

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN
134
dbenham

outストリームとerrストリームの両方をリダイレクトしたい場合

dir >> a.txt 2>&1
53
Kalpesh Soni

私はこれがもっと古い投稿であることを知っています、しかし誰かがグーグル検索でそれに出会うであろう、そしてそれはまたOPがコメントで尋ねたいくつかの質問が特に扱われなかったように見えます。また、これはSOに投稿された私の最初の答えですので、私にも簡単に行ってください。 :)

動的に生成されたファイル名を使用して出力をファイルにリダイレクトするために、私が行った(read:quick&dirty)アプローチは@dbenhamが提供する2番目の解決策です。だから、例えば、これ:

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

あなたがこれで見るようなファイルを作成します ターゲットディレクトリのファイルのスクリーンショット

それはこの出力が含まれます:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

また、このソリューションはロケールに依存するので、使用方法や使用方法には注意してください。

15
Anthony
@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause
9
saif
echo some output >"your logfile"

または

(
 echo some output
 echo more output
)>"Your logfile"

請求書を埋める必要があります。

出力をAPPENDにしたい場合は、>>の代わりに>を使用してください。 >は新しいログファイルを作成します。

8
Magoo

出力をファイルとコンソールにリダイレクトするために使用できるクールな小さなプログラムがあります。

some_command  ^|  TEE.BAT  [ -a ]  filename 
@ECHO OFF
:: Check Windows version
IF NOT "%OS%"=="Windows_NT" GOTO Syntax

:: Keep variables local
SETLOCAL

:: Check command line arguments
SET Append=0
IF /I [%1]==[-a] (
        SET Append=1
        SHIFT
)
IF     [%1]==[] GOTO Syntax
IF NOT [%2]==[] GOTO Syntax

:: Test for invalid wildcards
SET Counter=0
FOR /F %%A IN ('DIR /A /B %1 2^>NUL') DO CALL :Count "%%~fA"
IF %Counter% GTR 1 (
        SET Counter=
        GOTO Syntax
)

:: A valid filename seems to have been specified
SET File=%1

:: Check if a directory with the specified name exists
DIR /AD %File% >NUL 2>NUL
IF NOT ERRORLEVEL 1 (
        SET File=
        GOTO Syntax
)

:: Specify /Y switch for Windows 2000 / XP COPY command
SET Y=
VER | FIND "Windows NT" > NUL
IF ERRORLEVEL 1 SET Y=/Y

:: Flush existing file or create new one if -a wasn't specified
IF %Append%==0 (COPY %Y% NUL %File% > NUL 2>&1)

:: Actual TEE
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
        >  CON    ECHO.%%B
        >> %File% ECHO.%%B
)

:: Done
ENDLOCAL
GOTO:EOF

:Count
SET /A Counter += 1
SET File=%1
GOTO:EOF

:Syntax
ECHO.
ECHO Tee.bat,  Version 2.11a for Windows NT 4 / 2000 / XP
ECHO Display text on screen and redirect it to a file simultaneously
ECHO.
IF NOT "%OS%"=="Windows_NT" ECHO Usage:  some_command  ³  TEE.BAT  [ -a ]  filename
IF NOT "%OS%"=="Windows_NT" GOTO Skip
ECHO Usage:  some_command  ^|  TEE.BAT  [ -a ]  filename
:Skip
ECHO.
ECHO Where:  "some_command" is the command whose output should be redirected
ECHO         "filename"     is the file the output should be redirected to
ECHO         -a             appends the output of the command to the file,
ECHO                        rather than overwriting the file
ECHO.
ECHO Written by Rob van der Woude
ECHO http://www.robvanderwoude.com
ECHO Modified by Kees Couprie
ECHO http://kees.couprie.org
ECHO and Andrew Cameron
4
AquaAlex
@echo OFF
[your command] >> [Your log file name].txt

私は自分のバッチファイルで上記のコマンドを使用しました、そしてそれは働きます。ログファイルには、私のコマンドの結果が表示されます。

2
Indra Permana

次の2行をバッチファイルの先頭付近に追加します。以降のすべてのstdoutとstderrはlog.txtにリダイレクトされます。

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1
1
ilgitano

入力に「毒性」文字がある場合、これは失敗する可能性があります。 thisIsAnIn ^^^^ putのような入力を考慮することは、何が起こっているのかを理解する良い方法です。入力文字列は二重引用符で囲まなければならないというルールは確かにありますが、入力の意味がNTFSパーティション上の場所である場合にのみ、このルールは有効なルールであると感じています(URLのルールかもしれませんわからない)。しかし、これはもちろん任意の入力文字列のルールではありません(「良い方法」ですが、それで数えることはできません)。

0
jan antonin