1

非常感谢任何路过阅读本文的人。这是我的场景:

设想

  1. 操作系统是 w7px64。我以前没有使用过 .bat 文件,但对 cmd 有一定的了解。
  2. 我创建了一个成功的 .bat 文件,其中包含几十个命令、修改进程、服务、计划任务和电源方案(使用 SC、net stop、schtasks、powercfg 等命令)。
  3. 我将始终通过在 Windows 资源管理器中双击来启动 .bat(永远不会从 CMD 本身启动启动)。
  4. 该文件以暂停命令结束,以在完成所有任务后保持 cmd 窗口打开,使我能够滚动浏览结果。
  5. 该文件仅包含上述命令:不使用 echo 或其他任何内容。我喜欢看到完整的结果(它有助于我的故障排除)。

问题

尽管文件和命令完美地满足了我的需求,但结果对于 cmd 来说太长了(即使在 cmd 设置中最大化缓冲区之后);到执行最后一个命令时,我无法再向上滚动到第一个命令——由于空间限制,cmd 已清除它们。

目标

我想要一种方法让上述所有内容按原样继续(即使我无法在 CMD 中一直阅读)而且还可以在 .bat 文件中添加一个命令以同时将所有结果输出到文本文件(确切地出现在屏幕上:成功、失败、错误——一切)

这样的命令存在吗?

另外,如果有人知道 cmd 空间不足的解决方法,我也会喜欢的。再次感谢!

<

4

2 回答 2

0
@if (@CodeSection == @Batch) @then


if defined Restart goto Begin

rem TeeMyself.bat: Send output of this Batch file into screenOut.txt file
rem Antonio Perez Ayala

set Restart=True
call "%~F0" 2>&1 | Cscript //nologo //E:JScript "%~F0" 2>screenOut.txt
set Restart=
goto :EOF

:Begin

rem Place your Batch code here; for example:

rem The date: %date%, the time: %time%
dir TeeMyself.*
rem An error message sent to STDERR
verify bad

goto :EOF


@end


// JScript section

while ( ! WScript.Stdin.AtEndOfStream ) {
   // Read the next line from Stdin
   var line = WScript.Stdin.ReadLine();
   // Duplicate the line to Stdout and Stderr
   WScript.Stdout.WriteLine(line);
   WScript.Stderr.WriteLine(line);
}

运行此批处理文件后,screenOut.txt 文件的内容如下:

C:\Documents and Settings\Antonio\My Documents\test
>if defined Restart goto Begin 

C:\Documents and Settings\Antonio\My Documents\test
>rem Place your Batch code here; for example: 

C:\Documents and Settings\Antonio\My Documents\test
>rem The date: 05/06/2013, the time: 14:46:54.65 

C:\Documents and Settings\Antonio\My Documents\test
>dir TeeMyself.* 
 Volume in drive C has no label.
 Volume Serial Number is CCA1-5338

 Directory of C:\Documents and Settings\Antonio\My Documents\test

05/06/2013  02:43 p.m.               748 TeeMyself.bat
               1 File(s)            748 bytes
               0 Dir(s)  15,004,553,216 bytes free

C:\Documents and Settings\Antonio\My Documents\test
>rem An error message sent to STDERR 

C:\Documents and Settings\Antonio\My Documents\test
>verify bad 
An incorrect parameter was
entered for the command.

C:\Documents and Settings\Antonio\My Documents\test
>goto :EOF 

屏幕的内容是这样的:

C:\Documents and Settings\Antonio\My Documents\test
>if defined Restart goto Begin

C:\Documents and Settings\Antonio\My Documents\test
>rem TeeMyself.bat: Send output of this Batch file into screenOut.txt file

C:\Documents and Settings\Antonio\My Documents\test
>rem Antonio Perez Ayala

C:\Documents and Settings\Antonio\My Documents\test
>set Restart=True

C:\Documents and Settings\Antonio\My Documents\test
>call "C:\Documents and Settings\Antonio\My Documents\test\TeeMyself.bat"   2>&1  | Cscript //nologo //E:JScript "C:\Documents and Settings\Antonio\My Documents
\test\TeeMyself.bat"  2>screenOut.txt

===================================================
 The same contents of screenOut.txt file goes here
===================================================

C:\Documents and Settings\Antonio\My Documents\test
>set Restart=

C:\Documents and Settings\Antonio\My Documents\test
>goto :EOF

您应该使用"%~DP0screenOut.txt"名称以便在批处理文件的同一文件夹中创建文本文件。

于 2013-06-05T19:56:23.617 回答
0

假设您的批处理文件不是交互式的,并且您不需要在它们运行时查看它们,那么这将为您提供一个日志:

@echo off
call "d:\path here\to folder\mybatch" >"z:\logs\mybatch.log" 2>&1
start "" notepad "z:\logs\mybatch.log"
于 2013-06-05T07:01:13.817 回答