使用特定命令的输出作为变量来检测笔记本电脑还是台式电脑 Windows BATCH
Use Output of Specific Commands as Variables to Detect if Laptop or Desktop Computer Windows BATCH
我一直在为这个问题摸不着头脑。我想要做的是将自动检测添加到我的计算机诊断批处理脚本中,这样我就可以制作特定于笔记本电脑或台式机设备的脚本,这些脚本会根据设备类型自动执行。我认为我可以使用两个命令来检测这一点。
wmic systemenclosure get chassistypes
和
powercfg /batteryreport
不幸的是,我似乎无法将这些命令中的任何一个的输出解析为我可以实际使用的变量。 This guide 是我试图遵循的,但我 运行 遇到 wmic 和 powercfg 的问题,wmic 输出不能像我在链接指南中给出的示例那样按令牌过滤,powercfg 只是拒绝合作。这是众多无效组合之一
for /f %%i in ('powercfg /batteryreport') do set RESULT=%%i
任何帮助将不胜感激,我希望这是我的问题而不是批处理的限制。
如果你打开 cmd
和 运行 for /?
你会发现有不同的功能可以与命令一起使用,其中一个是 delims=
由于结果包含空格,您将需要 powercfg
:
对于 wmic
以下其中一项即可:
@echo off
for /f "delims={}" %%i in ('wmic systemenclosure get chassistypes ^| findstr "{"') do @set "chassistype=%%i"`
echo %chassistype%
或者通过使用 /VALUE
选项并使用标准输出作为变量和值设置变量:
@echo off
for /f "delims=" %%i in ('wmic systemenclosure get chassistypes /VALUE ^| findstr "{"') do set "%%i"`
echo %chassisTypes%
和powercfg
@echo off
for /f "delims=" %i in ('powercfg /batteryreport') do set "result=%%i"
echo %result%
您显然可以使用上述所有命令,而无需 set
只需 echo
命令即可。
虽然您收到了您似乎满意的答复,但我决定 post 另一种方法。我不确定您是否知道,但可能有几个结果可以确定为 Desktop
或 Laptop
,因此强大的脚本会针对每个结果执行检查。
这个batch-file version leverages powershell, instead of wmic,解析结果。它随后将术语 Desktop
或 Laptop
分配给我认为适合的术语:
@Echo Off
SetLocal EnableExtensions
Set "Type=" & For /F EOL^=- %%G In ('
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command
"(Get-CimInstance -Query 'Select * From CIM_Chassis').ChassisTypes"^
" | Select-Object -Property @{ Label = '-'; Expression = { Switch ($_) {"^
" { '3', '4', '5', '6', '7', '15', '16' -Eq $_ } { 'Desktop' };"^
" { '8', '9', '10', '11', '12', '14', '18', '21' -Eq $_ } { 'Laptop' };"^
" default { '' } } } }" 2^>NUL') Do Set "Type=%%G"
If Not Defined Type GoTo :EOF
Set Type & Pause
包含最后一行只是为了向您显示变量名称及其扩展值,您可以随意将其替换为您自己的代码,(必要时使用 %Type%
)。如果脚本没有暂停,即只是退出,则您的 ChassisTypes
输出未确定为 Desktop
或 Laptop
.
我一直在为这个问题摸不着头脑。我想要做的是将自动检测添加到我的计算机诊断批处理脚本中,这样我就可以制作特定于笔记本电脑或台式机设备的脚本,这些脚本会根据设备类型自动执行。我认为我可以使用两个命令来检测这一点。
wmic systemenclosure get chassistypes
和
powercfg /batteryreport
不幸的是,我似乎无法将这些命令中的任何一个的输出解析为我可以实际使用的变量。 This guide 是我试图遵循的,但我 运行 遇到 wmic 和 powercfg 的问题,wmic 输出不能像我在链接指南中给出的示例那样按令牌过滤,powercfg 只是拒绝合作。这是众多无效组合之一
for /f %%i in ('powercfg /batteryreport') do set RESULT=%%i
任何帮助将不胜感激,我希望这是我的问题而不是批处理的限制。
如果你打开 cmd
和 运行 for /?
你会发现有不同的功能可以与命令一起使用,其中一个是 delims=
由于结果包含空格,您将需要 powercfg
:
对于 wmic
以下其中一项即可:
@echo off
for /f "delims={}" %%i in ('wmic systemenclosure get chassistypes ^| findstr "{"') do @set "chassistype=%%i"`
echo %chassistype%
或者通过使用 /VALUE
选项并使用标准输出作为变量和值设置变量:
@echo off
for /f "delims=" %%i in ('wmic systemenclosure get chassistypes /VALUE ^| findstr "{"') do set "%%i"`
echo %chassisTypes%
和powercfg
@echo off
for /f "delims=" %i in ('powercfg /batteryreport') do set "result=%%i"
echo %result%
您显然可以使用上述所有命令,而无需 set
只需 echo
命令即可。
虽然您收到了您似乎满意的答复,但我决定 post 另一种方法。我不确定您是否知道,但可能有几个结果可以确定为 Desktop
或 Laptop
,因此强大的脚本会针对每个结果执行检查。
这个batch-file version leverages powershell, instead of wmic,解析结果。它随后将术语 Desktop
或 Laptop
分配给我认为适合的术语:
@Echo Off
SetLocal EnableExtensions
Set "Type=" & For /F EOL^=- %%G In ('
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command
"(Get-CimInstance -Query 'Select * From CIM_Chassis').ChassisTypes"^
" | Select-Object -Property @{ Label = '-'; Expression = { Switch ($_) {"^
" { '3', '4', '5', '6', '7', '15', '16' -Eq $_ } { 'Desktop' };"^
" { '8', '9', '10', '11', '12', '14', '18', '21' -Eq $_ } { 'Laptop' };"^
" default { '' } } } }" 2^>NUL') Do Set "Type=%%G"
If Not Defined Type GoTo :EOF
Set Type & Pause
包含最后一行只是为了向您显示变量名称及其扩展值,您可以随意将其替换为您自己的代码,(必要时使用 %Type%
)。如果脚本没有暂停,即只是退出,则您的 ChassisTypes
输出未确定为 Desktop
或 Laptop
.