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


110

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

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

cmdからバッチを実行して、出力をリダイレクトしたくないことに注意してください。可能であれば、バッチ内から出力をリダイレクトします。

回答:


161

ファイルポインターを複数回開いてEnd-Of-Fileに配置するため、遅い単純な単純な方法です。

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

より良い方法-ファイルのオープンと配置が一度だけなので、書き込みが簡単で高速です。

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

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

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

:sub
command1
command2
...
commandN

2020-04-17を編集

時々、2つ以上のファイルに繰り返し書き込みたい場合があります。画面に別のメッセージを表示することもできます。括弧で囲まれたブロックまたはサブルーチンの外側の未定義のハンドルにリダイレクトすることで、これを効率的に行うこと&ができます。次に、表記法を使用して、すでに開いているファイルを参照します。

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b

同じコマンドで複数のリダイレクトを実行すると、Microsoftリダイレクト実装の設計上の欠陥により、ハンドル9と8を逆の順序で使用することを選択しました。それは非常にありそうもないですが、あなたが十分に頑張れば、そのアプローチでさえバグを露呈する可能性があります。リダイレクトをステージングした場合、問題を回避することが保証されます。

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.

2
ファイルの残りの部分に設定できるソリューションが
Sam

3
呼び出しソリューションは%0を(この場合はsubに)変更することに注意してくださいこれは必要な場合とそうでない場合があります。
Jannes

1
@Jannes-True、ただし修飾子を追加すると、実行中のバッチスクリプトに関する情報をいつでも取得できます。たとえば%~f0、CALLed:subroutine内であっても、常にバッチスクリプトへの完全パスを提供します。
dbenham 2016

3
@ThariqNugrohotomo ->output.txt 2>&1
dbenham

2
@Moondra-同じスクリプト内でラベル付きサブルーチンを呼び出すための標準的なバッチ構文です。ドキュメントを表示するには、コンソールのコマンドラインから、cmd /?またはhelp cmdコンソールから実行します。3番目の方法のトリックは、CALLのリダイレクトがCALLされたサブルーチン内のすべてのコマンドに適用されることです。
dbenham 2018年

66

アウトストリームとエラーストリームの両方をリダイレクトしたい場合

dir >> a.txt 2>&1

27
+1。を使用>>するとに追加されることも指摘する価値がありますa.txta.txt代わりに上書きするには、を使用します>stackoverflow.com/q/4458231/1098302
アーロン

こんにちは、コンソールにも出力をリダイレクトする方法はありますか?
Sandeep Singh

それはそれが何をするか
Kalpesh Soni

16

私はこれが古い投稿であることを知っていますが、誰かがGoogle検索で偶然見つけてしまいます。また、コメントでOPが尋ねたいくつかの質問が具体的に扱われていないようです。また、これはSOに投稿された私の最初の回答です。:)

動的に生成されたファイル名を使用して出力をファイルにリダイレクトするために、@ dbenhamが提供する2番目のソリューションは、後を追う(read:quick&dirty)アプローチです。たとえば、これは次のとおりです。

@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

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


ありがとう、これは役に立ちました。簡単な質問ですが、.logと.txtを使用する理由はありますか?違いはありますか?
Moondra

1
@Moondraいいえ、そうではありません。この場合、それは単なる意味論です。それは、ファイルの種類に基づいて/ grepを必要とするアプリケーションがないと言っているわけではないので、ファイルが使用されているかどうか、またはどのように使用されているかに注意してください。
アンソニー

9
echo some output >"your logfile"

または

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

法案を埋める必要があります。

APPEND出力する場合は、の>>代わりに使用します>>新しいログファイルを開始します。


9
@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

これが最もエレガントな方法だと思います。ウェズリー、ありがとう!
キスワニ

5

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

some_command  ^|  TEE.BAT  [ -a ]  filename 


3
@echo OFF
[your command] >> [Your log file name].txt

上記のコマンドをバッチファイルで使用したところ、問題なく動作しました。ログファイルには、コマンドの結果が表示されます。


3

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

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

これでうまくいきました、ありがとう。これが失敗する可能性のある特別な考慮事項はありますか?(例:出力サイズのオーバーフロー)
CCarlos

こんにちは、あなたの答えをありがとう!コンソールでもそれをリダイレクトする方法はありますか?
Sandeep Singh

0

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


0

バッチファイルの下部に次の行を追加すると、CMDウィンドウ内に表示されているとおりにすべてが取得され、テキストファイルにエクスポートされます。

powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^a')
powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^c')
powershell Get-Clipboard > MyLog.txt

基本的に、すべて選択 -> クリップボードにコピー -> テキストファイルに貼り付けを実行します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.