批处理文件:提取具有特殊字符的字符串的一部分

时间:2013-10-29 04:28:44

标签: string batch-file

简短版

有人可以帮我从这样的字符串中提取:

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%

谢谢。

1 个答案:

答案 0 :(得分:4)

@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"