监控时输出多条命令行到文本文件
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 编码,而 PowerShell 和 SystemInfo 输出数据,每个字符只有一个字节。因此,不建议将所有数据直接输出到一个文本文件中,因为这会导致文本文件使用多种字符编码,从而导致文件不可读。因此,每个数据输出首先写入一个总是新建的临时文件。接下来使用命令 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
另请参阅:
- 关于 Using command redirection operators
的 Microsoft 文档
- DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
- How does the Windows Command Interpreter (CMD.EXE) parse scripts?
- Single line with multiple commands using Windows batch file
有一些非常高效的小型实用程序,例如 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
如何将每个命令行输出到一个文件中,同时在同一命令中继续监视结果。
@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 编码,而 PowerShell 和 SystemInfo 输出数据,每个字符只有一个字节。因此,不建议将所有数据直接输出到一个文本文件中,因为这会导致文本文件使用多种字符编码,从而导致文件不可读。因此,每个数据输出首先写入一个总是新建的临时文件。接下来使用命令 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 classwmic memorychip /?
wmic memorychip get /?
和 Win32_PhysicalMemory classwmic product /?
wmic product get /?
和 Win32_Product class
另请参阅:
- 关于 Using command redirection operators 的 Microsoft 文档
- DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
- How does the Windows Command Interpreter (CMD.EXE) parse scripts?
- Single line with multiple commands using Windows batch file
有一些非常高效的小型实用程序,例如 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