CMD上的批处理脚本以获取变量上的COM端口

问题描述 投票:1回答:3

我想存储可用COM端口的信息并将它们存储在变量上。

该命令必须在脚本中运行。只搜索我发现这个命令完美无缺:

wmic path win32_pnpentity get caption /format:table| find "COM" 

它返回:

USB-SERIAL CH340 (COM6)

哪个是我想让它识别的设备。在这个信息我需要提取COM66

batch-file cmd port
3个回答
0
投票

更新:这是从COM3中仅获取N部分的更短版本

@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! 
  • :: 要么 ::
@echo off && setlocal enabledelayedexpansion 
for /f "tokens=2delims=COM:" %%i in ('mode^|findstr /C:"COM"')do set "_com=%%i"&echo/!_com!

::批次结果3 ::

Obs。:对于命令行使用:for / f“tokens = 2delims = COM:”%% i in('mode ^ | findstr“COM”')设置“_com =%i”并调用echo /%_ com%


纯批量解决方案......

对于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

::命令行结果::

COM[n]:  DEVICE[id]:
COM3  =  \Device\huawei_cdcacm_AcmSerial1
COM4  =  \Device\huawei_cdcacm_AcmSerial0
 3 = COM3
 4 = COM4

enter image description here

通过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!

::命令行结果::

COM4 \Device\huawei_cdcacm_AcmSerial0
COM3 \Device\huawei_cdcacm_AcmSerial1
4 = COM4
3 = COM3

enter image description here

对不起,英语不是我的第一语言..


1
投票

这是一种在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

-1
投票

您将需要一个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"

你也说过,你想从6中提取COM6。这也是可能的;使用:

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和对面取代%%A

在cmd中,将%A替换为qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.