Используйте регулярные выражения findstr для поиска шаблонов в конвейерных результатах - PullRequest
0 голосов
/ 11 марта 2019

Я хочу найти шаблон (COM\d+) в выводе команды mode. Я попробовал:

mode | findstr /R (COM\d+)

Но это ничего не возвращает. Буду признателен, если вы поможете мне узнать, как правильно это сделать.

P.S.1 Благодаря комментариям у меня теперь есть mode | findstr /RC:"COM[0-9*]", что дает строку с данным соответствием. Теперь мне нужно найти способ распечатать только совпадение. может быть, используя for /f ... in для зацикливания строки?

P.S.2 Мне говорят, что mode | findstr /RC:"COM[123456789][0123456789]*" более безопасный вариант.

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Итак, почему бы просто не использовать только одну for команду цикла и addind \ для литерального поиска COM + RegEx в FindStr by это: "\C\O\M[0-9*]."

Obs.: По какой-то причине командная строка не работает для эхо-сигналов при первом запуске, только номер COM для команды echo/%_com%, только во втором запуске работает, но добавляя Call к команде echo/%_com%, результат отображается при первом запуске ...

  • В командной строке:
for /f "tokens=2delims=COM:" %i in ('mode ^| findstr /RC:"\C\O\M[0-9*]."') do set "_com=%i"&& call echo/%_com%
for /f "tokens=2delims=COM:" %i in ('mode ^| findstr /RC:"\C\O\M[0-9*]."') do set "_com=COM%i"&& call echo/%_com%
for /f "tokens=2delims=COM:" %i in ('mode ^| findstr /RC:"\C\O\M[0-9*]."') do set "_com=COM%i:"&& call echo/%_com%
  • результат 1-я строка команды: 3
  • результат 2-я строка команды: COM3
  • результат 3-я строка команды: 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!
for /f "tokens=2delims=COM:" %%i in ('mode ^| findstr /RC:"\C\O\M[0-9*]."') do set "_com=COM%%i"&& echo/!_com!
for /f "tokens=2delims=COM:" %%i in ('mode ^| findstr /RC:"\C\O\M[0-9*]."') do set "_com=COM%%i:"&& echo/!_com!
  • результат 1-й для команда: 3
  • результат 2-й для команда: COM3
  • результат 3-й для команда: COM3:

Увидь себя в командной строке:

mode | findstr /RC:"\C\O\M[0-9*]."
  • результат: Статус пункта диспозитиво COM3:

Извините, мой ограниченный Английский

1 голос
/ 11 марта 2019

Вот два простых примера по моим комментариям:

Из командной строки, чтобы удовлетворить ваш тег:

(For /F Delims^=: %A In ('Mode^|FindStr "COM[0-9]*:"')Do @For %B In (%A)Do @Set "var=%B")&Call Echo(%var%

Из пакетного файла, чтобы удовлетворить ваш тег:

@(For /F Delims^=: %%A In ('Mode^|FindStr "COM[0-9]*:"')Do @For %%B In (%%A)Do @Set "var=%%B")&Call Echo(%%var%%&Pause

Чтобы дополнить мой комментарий о WMI, вы можете попробовать:

Из командной строки:

For /F Skip^=1Delims^= %A In ('WMIC Path Win32_SerialPort Get DeviceID 2^>Nul')Do @For %B In (%A)Do @Echo(%B

Из пакетного файла:

@For /F Skip^=1Delims^= %%A In ('WMIC Path Win32_SerialPort Get DeviceID 2^>Nul')Do @For %%B In (%%A)Do @Echo(%%B&Pause
0 голосов
/ 26 марта 2019

Звучит так, будто вы просто хотите «COM1» или «COM3» в качестве выхода. Если это так, это будет сделано:

for /f "tokens=4 delims=: " %A in ('mode ^| findstr /i /r "COM[0-9]*:"') do @echo %A

Будет выдан следующий вывод:

COM1
...