|
本帖最后由 527104427 于 2014-6-7 16:21 编辑
这样似乎好一点,不知道S大有没有简便的办法
- ::%~1=pci\ven_8086&dev_3a22&cc_0106
- call :root_path ",%~1,"
- echo %root%
- exit
- :root_path
- if "%~1"=="" && exit
- setlocal
- set *
- set tmp=%~1
- :loop_tmp
- ::去掉后面的16个字符
- set tmp_left=%tmp:~,-16%
- set /a tmp_len=%@retval%
- ::搜索ID最后的16个字符,貌似最多只能搜16个,将找到后的位置赋值给tmp_skip
- cat --locatei="%tmp:~-16%" /driverpack.ini | call :check_tmp=
- ::假如搜不到,去掉第一个逗号继续搜
- if not exist tmp_skip && if "%tmp:~,1%"=="," && set tmp=%tmp:~1% && goto :loop_tmp
- ::再搜不到,去掉最后一个逗号继续搜
- if not exist tmp_skip && if "%tmp:~-1%"=="," && set tmp=%tmp:~,-1% && goto :loop_tmp
- set /a left_skip=%tmp_skip%
- :check_[
- ::下面就是搜索 [ ,往前搜500个字符。找不到再往前搜500个字符,依此循环至0位置
- if "%left_skip%"=="0" && goto :ext_check
- set /a left_skip=%left_skip%-500
- if "%left_skip%"<="0" && set /a left_skip=0
- set /a left_len=%tmp_skip%-%left_skip%
- cat --skip=%left_skip% --length=%left_len% --locatei=[ /driverpack.ini | call :check_left=
- if not exist [_skip && goto :check_[
- ::找到 [ 了,继续找 ],找到后提取 [] 里面的内容
- cat --skip=%[_skip% --number=1 --locatei=] /driverpack.ini > nul
- set /a ]_skip=%?%
- if "%]_skip%"=="0" && goto :ext_check
- set /a len=%]_skip%-%[_skip%-1
- set /a skip=%[_skip%+1
- echo -n > (md)0x28150+28
- cat --skip=%skip% --length=%len% /driverpack.ini > (md)0x28150+28
- ::将 - 替换为 / ,然后在前面加上 D/M/
- cat --locate=\x2D --replace=\x2F (md)0x28150+28
- cat (md)0x28150+28 | set /u root=D/M/
- :ext_check
- endlocal && set root=%root%
- exit
- :check_left
- ::假如搜到的结果有多个,那就取最靠近 [ 的那个
- if "%~1"=="" && exit
- if "%~2"=="" && set /a [_skip=0x%~1 && exit
- shift 1
- goto :check_left
- :check_tmp
- ::找到的结果应该不止一个,那就再截取前面的%tmp_len%个字符和%tmp_left%比较,假如相同,那就找到了ID的位置
- if "%~1"=="" && set tmp_skip= && exit
- set /a tmp_skip=0x%~1
- if "%tmp_left%"=="" && exit
- set /a tmp_skip=%tmp_skip%-%tmp_len%
- cat --skip=%tmp_skip% --length=%tmp_len% /driverpack.ini | set tmp_tmp=
- if /i "%tmp_tmp%"=="%tmp_left%" && exit
- shift 1
- goto :check_tmp
复制代码 |
|