监控时输出多条命令行到文本文件

Output multi command lines to text file while monitoring

如何将每个命令行输出到一个文件中,同时在同一命令中继续监视结果。

@echo off
Title %~n0

if not "%1" == "max" start /MAX cmd /c %0 max & exit/b

Echo Hard Disk Info
set record="C:\%computername%.txt"
Echo.
powershell "get-physicaldisk">C:\%computername%.txt>con
echo=================================
Echo.
Echo CPU Info
Echo.
wmic cpu get caption, name
echo=================================
Echo.
Echo RAM Info
Echo.
wmic memorychip get capacity,memorytype,speed,typedetail,manufacturer
echo=================================
echo.
Echo Windows Version
Echo.
systeminfo | findstr /B /i /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"System Locale" /C:"Input Locale"

echo=================================
Echo.
Echo Office Version
echo.
Echo LCID = 1033-English(US) 
wmic product where "Name like '%%Office%%'" get language,name, version
Pause

@exit %0

以下代码可用于将所有内容写入文件并显示在控制台中 window:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
title %~n0
if not "%~1" == "max" start /MAX %SystemRoot%\System32\cmd.exe /D /C %0 max & exit /B

set "RecordFile=%UserProfile%\%ComputerName%.txt"
del "%RecordFile%" 2>nul
set "TempFile=%TEMP%\%~n0.tmp"

call :OutputInfo "Hard Disk Info"
call :OutputData %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe "Get-PhysicalDisk"

call :OutputInfo "CPU Info"
call :OutputData %SystemRoot%\System32\wbem\wmic.exe CPU GET Caption,Name

call :OutputInfo "RAM Info"
call :OutputData %SystemRoot%\System32\wbem\wmic.exe MEMORYCHIP GET Capacity,MemoryType,Speed,TypeDetail,Manufacturer

call :OutputInfo "Windows Version"
call :OutputData %SystemRoot%\System32\cmd.exe /D /S /C "%SystemRoot%\System32\systeminfo.exe 2>nul | %SystemRoot%\System32\findstr.exe /B /I /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"System Locale" /C:"Input Locale""

call :OutputInfo "Microsoft Office Version"
echo LCID 1033 = English (US)>>"%RecordFile%"
echo LCID 1033 = English (US)
call :OutputData %SystemRoot%\System32\wbem\wmic.exe PRODUCT where "Name like '%%%%Microsoft Office%%%%'" GET Language,Name,Version

del "%TempFile%" 2>nul
echo/
pause
exit /B

:OutputData
%* >"%TempFile%"
for %%I in ("%TempFile%") do if %%~zI == 0 goto :EOF
type "%TempFile%">>"%RecordFile%"
type "%TempFile%"
goto :EOF

:OutputInfo
if not exist "%RecordFile%" goto InfoOutput
(echo =================================& echo/)>>"%RecordFile%"
echo =================================
echo/
:InfoOutput
(echo %~1&echo/)>>"%RecordFile%"
echo %~1
echo/
goto :EOF

注1:

默认安装 PowerShell 2.0 的 PowerShell 命令行输出 Windows 7 由于 cmdlet Get-PhysicalDisk 不可用,因此只有以下错误消息使用 PowerShell 2.0.

The term 'Get-PhysicalDisk' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
At line:1 char:17
+ Get-PhysicalDisk <<<< 
    + CategoryInfo          : ObjectNotFound: (Get-PhysicalDisk:String) [], Co 
   mmandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

注二:

WMIC 输出数据始终使用带有字节顺序标记 (BOM) 的 UTF-16 Little Endian(每个字符两个或四个字节)进行 Unicode 编码,而 PowerShellSystemInfo 输出数据,每个字符只有一个字节。因此,不建议将所有数据直接输出到一个文本文件中,因为这会导致文本文件使用多种字符编码,从而导致文件不可读。因此,每个数据输出首先写入一个总是新建的临时文件。接下来使用命令 TYPE 输出临时文件内容,并将每个字符编码输出的一个字节附加到记录文件。

注3:

需要用三个额外的百分号将 Microsoft Office 周围的 % 转义,以将 %Microsoft Office% 传递给子例程 OutputData 中执行的 wmic.exe。每个 % 都必须再转义一个 % 才能在批处理文件中解释为文字字符。但是带有 CALL 的命令行会被 Windows 命令处理器第二次处理。因此,两边都需要两个百分号才能在第一次解析命令行后获得第一个 %%Microsoft Office%%,在由命令 CALL 引起的第二次解析后获得下一个 %Microsoft Office% .

注4:

仅使用 %Office% 而不是 %Microsoft Office% 可能会导致输出不是真正想要的,例如:

0         Microsoft Visual Studio 2010 Tools for Office Runtime (x64)       10.0.50908

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • cmd /?
  • del /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • powershell get-help get-physicaldisk
  • set /?
  • start /?
  • systeminfo /?
  • title /?
  • type /?
  • wmic /?
  • wmic cpu /?
  • wmic cpu get /?Win32_Processor class
  • wmic memorychip /?
  • wmic memorychip get /?Win32_PhysicalMemory class
  • wmic product /?
  • wmic product get /?Win32_Product class

另请参阅:

有一些非常高效的小型实用程序,例如 windows 版本的 Tee 或 Tail,可以在这种情况下提供很大帮助。然而,本着突击队的精神,一种可能性是将现有的批处理文件包装在 Tee 的 Power Shell 仿真中。

On Windows 7 我对你的 cmd 文件有点小问题,因为 get-physicaldisk 无法识别,但它并没有过多地拖延输出。请参阅@mofi 的注释 1。

另外注意你的结束暂停不可见(由于这种嵌套方法)所以我发现用[=15替换暂停=]

echo Press any key to exit & Pause>nul

对我来说效果更好。另外,您的 max 选项似乎是倒退的,因为没有 max 我会得到更大的输出!

无论如何,假设您的 cmd 是“monitor.cmd”,下面的运行速度与预期的一样慢。

powershell.exe -C "& {cmd /c 'monitor max' | tee -filepath monitor.log}"

查看您可以使用的输出

type monitor.log