CMD 上的批处理脚本以获取变量上的 COM 端口
Batch Script on CMD to get COM port on a variable
我想存储可用 COM 端口的信息并将它们存储在变量中。
命令必须 运行 在脚本中。仅搜索我发现这个命令完美运行:
wmic path win32_pnpentity get caption /format:table| find "COM"
它returns:
USB-SERIAL CH340 (COM6)
我想让它识别哪个设备。在此信息上,我需要提取 COM6
或 6
.
您将需要一个 for /F
循环来解析此命令的输出。尽管这行不通,因为我的电脑输出Intel(R)*(COM3)
,我们谈谈你的电脑和一个具体的输出。我建议你使用:
for /F "tokens=2 delims=()" %%A IN ('wmic path win32_pnpentity get caption /format:table ^| findstr /c:"COM"') do echo %%A
这个,会echo
的信息。要将其存储在变量中,请使用 set "com_info=%%A"
.
你也说过,你想从 COM6
中提取 6
。这也是可能的;使用:
for /F "tokens=2 delims=()" %%A IN ('wmic path win32_pnpentity get caption /format:table ^| findstr /c:"COM"') do set "com_info=%%A"&call set "com_num=%com_info:~-1%"
将 echo
替换为 set
或您想要 echo
的相反位置。
在 cmd 中,将 %%A
替换为 %A
。
这是一种在 cmd .bat 脚本文件中执行此操作的方法。这将导致设置最后一个 com 端口。我没有看到任何关于如何处理多个 com 端口的指示。
@ECHO OFF
FOR /F "delims=^T tokens=1,2" %%a IN ('powershell -NoLogo -NoProfile -Command ^
"Get-CimInstance -ClassName Win32_PnPEntity |" ^
"Where-Object { $_.Name -match '.*\(COM(\d)\)'} | Out-Null;" ^
"$Matches[0] + '^t' + $Matches[1]"') DO (
SET "CPNAME=%%a"
SET "CPNUM=%%b"
)
ECHO CPNAME is %CPNAME%
ECHO CPNUM is %CPNUM%
当然,如果直接使用 PowerShell,没有 cmd.exe 开销会更容易。您可以将以下代码保存在 comport.ps1
.
中
Get-CimInstance -ClassName Win32_PnPEntity |
Where-Object { $_.Name -match '.*\(COM(\d)\)' } | Out-Null
$cpname = $Matches[0]
$cpnum = $Matches[1]
$cpname
$cpnum
Update:这是更short的版本,只得到N 来自 COM3
的部分
@echo off && setlocal enabledelayedexpansion
for /f "tokens=2delims=COM:" %%i in ('mode ^| findstr /RC:"\C\O\M[0-9*]"') do set "_com=%%i" & echo/!_com!
- :: or ::
@echo off && setlocal enabledelayedexpansion
for /f "tokens=2delims=COM:" %%i in ('mode^|findstr /C:"COM"')do set "_com=%%i"&echo/!_com!
:: 批量结果 3 ::
Obs.: For command line use: for /f "tokens=2delims=COM:" %%i in ('mode^|findstr "COM"')do set "_com=%i"& call echo/%_com%
Pure batch solution...
对于bat文件,建议使用chgport
或者Reg Query
来自 chgport
:
通过使用此变量:!_com_[%%L]!
得到 COM+n
通过使用此变量:%%L
得到 n
@echo off & setlocal enabledelayedexpansion & set "_cnt=0"
cd /d "%systemroot%"
for /f "tokens=* delims= " %%C in ('where /r . chgport.exe') do set "_chgport=%%~fC"
for /f "delims== tokens=1,2" %%i in ('!_chgport! ^| findstr /v "#"') do set /a "_cnt+=1" && set "_com_[!_cnt!]=%%i ^= %%j"
popd & echo/COM[n]: DEVICE[id]: & for /l %%L in (1 1 !_cnt!) do echo/!_com_[%%L]!
:: for get number only :: By using %%C**
for /l %%L in (1 1 !_cnt!) do for /f %%C in ('echo/!_com_[%%L]:COM^=!') do set "_com_N=%%C" & echo/ !_com_N! = COM%%C
:: Commandline result ::
COM[n]: DEVICE[id]:
COM3 = \Device\huawei_cdcacm_AcmSerial1
COM4 = \Device\huawei_cdcacm_AcmSerial0
3 = COM3
4 = COM4
来自 Reg Query
:
通过使用此变量:!_com#!
得到 COM+n
通过使用这个变量:!_com#:COM=!
得到 n
@echo off & setlocal enabledelayedexpansion
set _key="HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM"
for /f "tokens=1,3 delims= " %%i in ('reg query !_key! ^| find /v "HKEY"') do (
set "_device=%%i" & set "_com#=%%j" & echo/!_com#! !_device! )
:: for get number only :: By using !_com_N:~3! to get [n]
for /f "tokens=3 delims= " %%c in ('reg query !_key! ^| find /v "HKEY"') do set "_com_N=%%c"&& echo/!_com_N:~3! = !_com_N!
:: Commandline result ::
COM4 \Device\huawei_cdcacm_AcmSerial0
COM3 \Device\huawei_cdcacm_AcmSerial1
4 = COM4
3 = COM3
抱歉,英语不是我的第一语言..
我想存储可用 COM 端口的信息并将它们存储在变量中。
命令必须 运行 在脚本中。仅搜索我发现这个命令完美运行:
wmic path win32_pnpentity get caption /format:table| find "COM"
它returns:
USB-SERIAL CH340 (COM6)
我想让它识别哪个设备。在此信息上,我需要提取 COM6
或 6
.
您将需要一个 for /F
循环来解析此命令的输出。尽管这行不通,因为我的电脑输出Intel(R)*(COM3)
,我们谈谈你的电脑和一个具体的输出。我建议你使用:
for /F "tokens=2 delims=()" %%A IN ('wmic path win32_pnpentity get caption /format:table ^| findstr /c:"COM"') do echo %%A
这个,会echo
的信息。要将其存储在变量中,请使用 set "com_info=%%A"
.
你也说过,你想从 COM6
中提取 6
。这也是可能的;使用:
for /F "tokens=2 delims=()" %%A IN ('wmic path win32_pnpentity get caption /format:table ^| findstr /c:"COM"') do set "com_info=%%A"&call set "com_num=%com_info:~-1%"
将 echo
替换为 set
或您想要 echo
的相反位置。
在 cmd 中,将 %%A
替换为 %A
。
这是一种在 cmd .bat 脚本文件中执行此操作的方法。这将导致设置最后一个 com 端口。我没有看到任何关于如何处理多个 com 端口的指示。
@ECHO OFF
FOR /F "delims=^T tokens=1,2" %%a IN ('powershell -NoLogo -NoProfile -Command ^
"Get-CimInstance -ClassName Win32_PnPEntity |" ^
"Where-Object { $_.Name -match '.*\(COM(\d)\)'} | Out-Null;" ^
"$Matches[0] + '^t' + $Matches[1]"') DO (
SET "CPNAME=%%a"
SET "CPNUM=%%b"
)
ECHO CPNAME is %CPNAME%
ECHO CPNUM is %CPNUM%
当然,如果直接使用 PowerShell,没有 cmd.exe 开销会更容易。您可以将以下代码保存在 comport.ps1
.
Get-CimInstance -ClassName Win32_PnPEntity |
Where-Object { $_.Name -match '.*\(COM(\d)\)' } | Out-Null
$cpname = $Matches[0]
$cpnum = $Matches[1]
$cpname
$cpnum
Update:这是更short的版本,只得到N 来自 COM3
的部分@echo off && setlocal enabledelayedexpansion
for /f "tokens=2delims=COM:" %%i in ('mode ^| findstr /RC:"\C\O\M[0-9*]"') do set "_com=%%i" & echo/!_com!
- :: or ::
@echo off && setlocal enabledelayedexpansion
for /f "tokens=2delims=COM:" %%i in ('mode^|findstr /C:"COM"')do set "_com=%%i"&echo/!_com!
:: 批量结果 3 ::
Obs.: For command line use: for /f "tokens=2delims=COM:" %%i in ('mode^|findstr "COM"')do set "_com=%i"& call echo/%_com%
Pure batch solution...
对于bat文件,建议使用chgport
或者Reg Query
来自 chgport
:
通过使用此变量:!_com_[%%L]!
得到 COM+n
通过使用此变量:%%L
得到 n
@echo off & setlocal enabledelayedexpansion & set "_cnt=0"
cd /d "%systemroot%"
for /f "tokens=* delims= " %%C in ('where /r . chgport.exe') do set "_chgport=%%~fC"
for /f "delims== tokens=1,2" %%i in ('!_chgport! ^| findstr /v "#"') do set /a "_cnt+=1" && set "_com_[!_cnt!]=%%i ^= %%j"
popd & echo/COM[n]: DEVICE[id]: & for /l %%L in (1 1 !_cnt!) do echo/!_com_[%%L]!
:: for get number only :: By using %%C**
for /l %%L in (1 1 !_cnt!) do for /f %%C in ('echo/!_com_[%%L]:COM^=!') do set "_com_N=%%C" & echo/ !_com_N! = COM%%C
:: Commandline result ::
COM[n]: DEVICE[id]:
COM3 = \Device\huawei_cdcacm_AcmSerial1
COM4 = \Device\huawei_cdcacm_AcmSerial0
3 = COM3
4 = COM4
来自 Reg Query
:
通过使用此变量:!_com#!
得到 COM+n
通过使用这个变量:!_com#:COM=!
得到 n
@echo off & setlocal enabledelayedexpansion
set _key="HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM"
for /f "tokens=1,3 delims= " %%i in ('reg query !_key! ^| find /v "HKEY"') do (
set "_device=%%i" & set "_com#=%%j" & echo/!_com#! !_device! )
:: for get number only :: By using !_com_N:~3! to get [n]
for /f "tokens=3 delims= " %%c in ('reg query !_key! ^| find /v "HKEY"') do set "_com_N=%%c"&& echo/!_com_N:~3! = !_com_N!
:: Commandline result ::
COM4 \Device\huawei_cdcacm_AcmSerial0
COM3 \Device\huawei_cdcacm_AcmSerial1
4 = COM4
3 = COM3
抱歉,英语不是我的第一语言..