Пакетный файл: извлечение части строки со специальными символами

63
6

Укороченная версия

Может кто-нибудь, пожалуйста, помогите мне извлечь из строки, как это:

HDAUDIO\FUNC_01&VEN_10EC&DEV_0892&SUBSYS_18492892&REV_1003\4&2120120&0&0001: Realtek High Definition Audio

только часть перед вторым обратным слэшем (\):

HDAUDIO\FUNC_01&VEN_10EC&DEV_0892&SUBSYS_18492892&REV_1003

Трудная часть состоит в том, что цифры не являются постоянными и могут быть разными, то же самое относится к общей длине строки, единственной константой является то, что она имеет 2 слэша, и мне нужна часть перед второй косой чертой (вторая косая черта и все после нее удален)

Спасибо.

Длинная версия, если вы заинтересованы

Я пытаюсь получить часть строки, возвращенную другим приложением:

devcon.exe find "HDAUDIO\FUNC_01"

Он возвращает что-то вроде этого:

HDAUDIO\FUNC_01&VEN_10DE&DEV_0018&SUBSYS_10DE0101&REV_1001\5&13022D22&0&0201: NVIDIA High Definition Audio
HDAUDIO\FUNC_01&VEN_10EC&DEV_0892&SUBSYS_18492892&REV_1003\4&2120120&0&0001: Realtek High Definition Audio
HDAUDIO\FUNC_01&VEN_10DE&DEV_0018&SUBSYS_10DE0101&REV_1001\5&13022D22&0&0101: NVIDIA High Definition Audio
3 matching device(s) found.

Из этих строк мне нужно захватить только одну строку:

HDAUDIO\FUNC_01&VEN_10EC&DEV_0892&SUBSYS_18492892&REV_1003\4&2120120&0&0001: Realtek High Definition Audio

И с этой строки мне нужно получить только эту часть:

HDAUDIO\FUNC_01&VEN_10EC&DEV_0892&SUBSYS_18492892&REV_1003

К сожалению, эта линия может отличаться для разных систем, единственной последовательной частью является начало:

HDAUDIO\FUNC_01&VEN_10EC&DEV_

и что он имеет две черты. Это означает, что единственная клавиша может использоваться для обработки строки - это вторая обратная косая черта - что-то после второго "\" необходимо удалить.

Пока я могу получить нужную целую строку, но я не могу понять, как извлечь нужную часть из этой строки:

@echo off
@setlocal enabledelayedexpansion
FOR /F "tokens=* USEBACKQ" %%F IN ('devcon.exe find "HDAUDIO\FUNC_01&VEN_10EC"') DO (
set string=%%F
set match=!string:HDAUDIO\FUNC_01^&VEN_10EC^&DEV_=!
if not !match!==!string! goto found
)
endlocal
:found
set str="%string%"
set id=!str:~1,-1!
set id=!id:^&=^^^&!
echo %id%

В качестве примера здесь приведена часть для проверки кода:

set string="HDAUDIO\FUNC_01&VEN_10EC&DEV_0892&SUBSYS_18492892&REV_1003\4&2120120&0&0001: Realtek High Definition Audio"
set str=%string%
set id=!str:~1,-1!
set id=!id:^&=^^^&!
echo %id%

Спасибо.

спросил(а) 2021-01-25T19:37:34+03:00 4 месяца, 4 недели назад
1
Решение
99

@echo off
set "string=HDAUDIO\FUNC_01&VEN_10EC&DEV_0892&SUBSYS_18492892&REV_1003\4&2120120&0&0001: Realtek High Definition Audio"
for /f "tokens=1,2 delims=\" %%a in ("%string%") do echo "%%a\%%b"

ответил(а) 2021-01-25T19:37:34+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема