将相同的输出写入多个日志

时间:2014-03-11 11:05:28

标签: batch-file batch-processing

是否可以将相同的输出写入批处理中的多个文件? 我想要这样做的原因是因为我有一个大型批处理脚本可以生成非常详细的日志。这很好,但我想输出一个修剪后的版本的日志,其中的细节很少。批处理也不能多次运行。

比方说我有一个简单的批次:

   Echo This is a Batch Script >> Path\File1 & Path\File2
   osql -S%SERVERNAME% -E -d%DATABASENAME% -Q%SQL% >> Path\File1

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

也许您可以使用Unix工具中的tee命令。可从here免费下载。可以把它想象成一个“T”,管道工可能会把管道放在两个方向送水。

osql -S%SERVERNAME% -E -d%DATABASENAME% -Q%SQL% | tee file1 file2 file3

看一些示例,因为我不完全确定您的完整处理要求是什么,请参阅here

如果你想在一个流上进行一些处理,你可以这样做:

osql -S%SERVERNAME% -E -d%DATABASENAME% -Q%SQL% | tee unfiltered.txt | FINDSTR /v "UglyStuff" > filtered.txt

答案 1 :(得分:1)

第二个答案,因为它不同......

您可以使用一些VBScript,像这样将osql输出发送到stdout和stderr,然后分别处理这两个。这节省了您需要安装任何Unix工具。

将其另存为tee.vbs

REM ############################################################################
REM File: tee.vbs
REM Author: Mark Setchell
REM I don't need any Unix purists to tell me it is not functionally idential to
REM the Unix 'tee' command, please. It does a job - that's all. And I also know
REM there is no error checking. It illustrates a technique.
REM ############################################################################
Set fso = CreateObject ("Scripting.FileSystemObject") 
Set stdout = fso.GetStandardStream (1) 
Set stderr = fso.GetStandardStream (2) 

Do While Not WScript.StdIn.AtEndOfStream
   REM Read in next line of input
   Line  = WScript.StdIn.ReadLine()
   stdout.WriteLine(Line)
   stderr.WriteLine(Line)
Loop

然后像这样运行你的osql:

osql -S%SERVERNAME% -E -d%DATABASENAME% -Q%SQL% | cscript /nologo tee.vbs 2> unfiltered.txt | FINDSTR "goodstuff" > filtered.txt

基本上,tee.vbs脚本写入stderr的任何内容都被重定向到2>点的任何地方,而tee.vbsstdout的任何FINDSTR写入tee.vbs 1}}命令。

理想情况下,您可以将过滤放在{{1}}文件中,以获得最大的灵活性。