Пакетный скрипт на CMD для получения COM-порта на переменную - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу сохранить информацию о моих доступных COM-портах и ​​сохранить их в переменной.

Команда должна выполняться в скрипте.Поиск только я нашел эту команду, которая отлично работает:

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

Возвращает:

USB-SERIAL CH340 (COM6)

Какое устройство я хочу, чтобы он распознал.По этой информации мне нужно извлечь COM6 или 6.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Вот способ сделать это в файле сценария 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%

Конечно, проще без использования cmd.exe, если использовать PowerShell напрямую.Вы можете сохранить следующий код в comport.ps1.

Get-CimInstance -ClassName Win32_PnPEntity |
    Where-Object { $_.Name -match '.*\(COM(\d)\)' } | Out-Null
$cpname = $Matches[0]
$cpnum = $Matches[1]

$cpname
$cpnum
0 голосов
/ 16 февраля 2019

Обновление : это более короткая версия для получения только 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! 
  • :: или ::
@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

Извините,Английский не мой родной язык ..

0 голосов
/ 16 февраля 2019

Вам понадобится цикл 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 и наоборот.

В cmd, замените %%A на %Aгде представлены.

...