Batch file 格式化结果为.CMD
我正在尝试创建一个运行和检查基本系统信息的基本脚本,但我希望格式化输出,使结果在同一行上并且易于阅读Batch file 格式化结果为.CMD,batch-file,cmd,Batch File,Cmd,我正在尝试创建一个运行和检查基本系统信息的基本脚本,但我希望格式化输出,使结果在同一行上并且易于阅读 @Echo Off systeminfo | findstr /B /C:"OS Name" /C:"OS Version" wmic cpu get name, status systeminfo | findstr /C:"Total Physical Memory" @echo off & setlocal ENABLEDELAYEDEXPANSION SET "volum
@Echo Off
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
wmic cpu get name, status
systeminfo | findstr /C:"Total Physical Memory"
@echo off & setlocal ENABLEDELAYEDEXPANSION
SET "volume=C:"
FOR /f "tokens=1*delims=:" %%i IN ('fsutil volume diskfree %volume%') DO (
SET "diskfree=!disktotal!"
SET "disktotal=!diskavail!"
SET "diskavail=%%j"
)
FOR /f "tokens=1,2" %%i IN ("%disktotal% %diskavail%") DO SET "disktotal=%%i"& SET "diskavail=%%j"
ECHO(Total Space: %disktotal:~0,-9% GB
ECHO(Available Space: %diskavail:~0,-9% GB
systeminfo | find "System Boot Time:"
systeminfo | find "System Type:"
Echo Antivirus: & wmic /node:localhost /namespace:\\root\SecurityCenter2 path AntiVirusProduct Get DisplayName | findstr /V /B /C:displayName || echo No Antivirus installed
这方面的主要示例是wmic命令将结果放在下一行而不是同一行
另外,如果您能给我提供更好的脚本编写方法,我将不胜感激。WMIC的输出是unicode 通过将值传递给另一个FOR/F循环,可以删除尾随的
。这也会删除虚拟的“空白”行(实际上是
)
@Echo关闭
调用:获取CPU名称CPU名称
设置“WMIC_Antivirus=WMIC/node:localhost/namespace:\\root\SecurityCenter2路径AntiVirusProduct Get DisplayName^ findstr/V/B/C:DisplayName”
@对于/F“delims=“%%I in(“%WMIC_Antivirus%”)do(
对于/f“delims=“%”中的%%A(“%%I”)设置“Antivirus=%%A”
)
回显CPU:%CPU\u名称%
echo防病毒软件:%Antivirus%
暂停和退出
::----------------------------------------------------
:获取CPU
设置“WMIC_CPU=WMIC CPU获取名称/值”
对于/F“令牌=2 delims==”%%I IN(
“%WMIC_CPU%^查找/I”%~1“2^>^nul”
)DO FOR/F“delims=“%%A IN(“%%I”)DO设置“%2=%%A”
退出/b
::----------------------------------------------------
您可以尝试将输出保存到文本文件中:
@Echo关闭
:::::::::::::::::::::::::::::::::::::::::
::自动检查并获取管理员权限
:::::::::::::::::::::::::::::::::::::::::
REM-->检查权限
注册查询“HKU\S-1-5-19\Environment”>nul 2>&1
REM-->如果设置了错误标志,则我们没有管理员。
如果“%errorlevel%”NEQ“0”(
回声。
回音**************************************
ECHO正在运行管理shell…请稍候。。。
回音**************************************
转到UACPrompt
)其他(转到转到管理)
:UACPrompt
echo Set UAC=CreateObject^(“Shell.Application”^)>%temp%\getadmin.vbs
设置参数=%*:“=”“”
echo UAC.ShellExecute“cmd.exe”、“/c”“%~s0”“%params%”、“,”runas“,1>>%temp%\getadmin.vbs”
%temp%\getadmin.vbs
删除“%temp%\getadmin.vbs”
退出/B
:gotAdmin
::::::::::::::::::::::::::::
::开始
::::::::::::::::::::::::::::
SetLocal EnableDelayedExpansion
设置“Log=%~dp0Log.txt”
如果存在“%Log%”删除“%Log%”
调用:获取CPU名称CPU名称
设置“WMIC_Antivirus=WMIC/node:localhost/namespace:\\root\SecurityCenter2路径AntiVirusProduct Get DisplayName^ findstr/V/B/C:DisplayName”
@对于/F“delims=“%%I in(“%WMIC_Antivirus%”)do(
对于/f“delims=“%”中的%%A(“%%I”)设置“Antivirus=%%A”
)
(
回声。
回声*************************************一般信息***********************************
回声。
在配置文件%userprofile%上的%username%下运行的回显
回显计算机名称:%computername%
回声。
系统信息
Echo操作系统:
回显处理器架构:%PROCESSOR\u架构%
回波处理器的\u数量:%u处理器的\u数量%
回显处理器\u标识符:%s处理器\u标识符%
回显处理器级别:%PROCESSOR\u LEVEL%
回显处理器\u版本:%PROCESSOR\u版本%
回显操作系统类型:%OS%
回音(
回显程序文件路径:%Programfiles%
回显程序文件(86^)路径:%Programfiles(86^)%
回显程序W6432路径:%ProgramW6432%
回显PSModulePath:%PSModulePath%
回显系统根:%SystemRoot%
回显临时文件夹:%Temp%
回显CPU:!CPU\u名称!
echo Antivirus:!Antivirus!
回声。
Echo****************************驱动信息*************************************
回声。
Echo列出了当前连接的驱动器:
wmic logicaldisk获取标题、说明、卷名|查找/v“”
回声。
回显物理驱动器信息:
对于('fltmc卷^ |查找“:”)中的/F“令牌=1-3%%A,请执行echo%%A%%B%%C
)>>%Log%
启动“”%Log%”并退出
::----------------------------------------------------
:获取CPU
设置“WMIC_CPU=WMIC CPU获取名称/值”
对于/F“令牌=2 delims==”%%I IN(
“%WMIC_CPU%^查找/I”%~1“2^>^nul”
)DO FOR/F“delims=“%%A IN(“%%I”)DO设置“%2=%%A”
退出/b
::----------------------------------------------------
fsutil
命令的输出略有不同。
如果可以的话,我选择了一个简单的选项
不确定防病毒输出,因为您需要
安装或不确定
它只运行一次systeminfo
,以节省时间
查看set/?
,了解有关替换的信息
使用
net session
命令用于测试脚本是否以管理员身份运行。
如果不是Admin,则将跳过fsutil
,因为它需要Admin
查看以获取/?
,了解脚本中使用的命令的用法
使用enabledelayedexpansion
可防止特殊情况
正在公开的字符,否则可能导致错误。
并在代码块中使用,以根据需要延迟扩展
从被空格替换的值字符串中删除逗号。
逗号通常用作千位分隔符,数字看起来很奇怪
而是使用空格。这是因为使用了简单的
for
循环将逗号解释为参数分隔符。其他
角色扮演者也可以做到这一点,尽管可能有一个空间更好
在他们的情况下,我需要做什么更改才能使它与其他WMIC命令一起工作,如“WMIC cpu获取名称、状态”或“WMIC产品,其中“name='name here'”获取名称、版本“好的,所以我找到了答案集WMIC_CMD=WMIC cpu获取名称@For/F”delims=“%%C in(“%WMIC_CMD%”)do(For/F“delims=“%%N in”(%%C”)do Set”CPU=%%N”)回显CPU类型:%CPU%但我仍在尝试格式化间距,以便它们大致对齐,是否有一种简单的方法来执行此操作?这不会将系统信息命令与wmic命令对齐,但将wmic放在一行是问题的一部分,但我需要对齐所有结果
@echo off
setlocal
for /f "tokens=1,* delims=:" %%A in ('systeminfo') do (
if "%%~A" == "OS Name" (
call :print "%%~A" %%B
) else if "%%~A" == "OS Version" (
call :print "%%~A" %%B
call :cpu
) else if "%%~A" == "Total Physical Memory" (
call :print "%%~A" %%B
call :fsutil C:
) else if "%%~A" == "System Boot Time" (
call :print "%%~A" %%B
) else if "%%~A" == "System Type" (
call :print "%%~A" %%B
)
)
:next
call :antivirus
pause
exit /b
:print
setlocal enabledelayedexpansion
set "name=%~1"
if not defined name exit /b
set "name=%~1 "
set "full=%*"
set "full=!full:,=!"
set "data="
set "skip1="
for %%A in (!full!) do (
if not defined skip1 (
set "skip1=defined"
) else if not defined data (
set "data=%%~A"
) else (
set "data=!data! %%~A"
)
)
echo !name:~,30!: !data!
exit /b
:antivirus
setlocal enabledelayedexpansion
set "antivirus="
for /f "tokens=*" %%A in ('
2^>nul wmic /node:localhost
/namespace:\\root\SecurityCenter2 path AntiVirusProduct
Get DisplayName /value
^| findstr /i /b /c:"DisplayName" ^|^| echo No Antivirus installed
') do set "antivirus=%%~A"
if /i "!antivirus:~,12!" == "DisplayName=" set "antivirus=!antivirus:~12!"
call :print Antivirus "!antivirus!"
exit /b
:cpu
for /f "tokens=1,* delims==" %%A in ('wmic cpu get name^, status /value') do (
call :print "%%~A" %%B
)
exit /b
:fsutil
setlocal enabledelayedexpansion
2>nul >nul net session || exit /b
for /f "tokens=1,* delims=:" %%A in ('2^>nul fsutil volume diskfree %1') do (
set "name=%%~A"
set "value=%%~B"
call :print "!name:bytes=GBs!" !value:~,-9!
)
exit /b