PDA

Показать полную графическую версию : Разбить строку на две подстроки по последнему символу \


kokos76
08-01-2016, 23:22
Имеется множество строк вида КОРЕНЬ_РАЗДЕЛА_РЕЕСТРА\название\подраздела\реестра\параметр_реестра разной длины, т.е. они содержат неодинаковое количество символов \ (получены экспортом из procmon). Помогите, пожалуйста, разбить каждую на две подстроки: КОРЕНЬ_РАЗДЕЛА_РЕЕСТРА\название\подраздела\реестра и параметр_реестра.

Цель - подать эти значения на вход cmd-скрипта, выполняющего экспорт конкретных параметров реестра (http://forum.oszone.net/post-1327492.html#post1327492) от ув. amel27. Если необходимо, массив исходных данных можно вынести в отдельный txt-файл. Дошёл до такого этапа и всё, большего моё гуманитарное образование не позволяет:

@Echo Off
if not exist "c:\backup\reg" mkdir c:\backup\reg
set count=1
for %%? in (
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\Fax\ChangeID"
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports\nul:"
"HKU\S-1-5-19\Software\Microsoft\Windows NT\CurrentVersion\Devices\Отправить в OneNote 2010"
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\Отправить в OneNote 2010\ChangeID"
) do call:reg_exp %%?
)
goto :end

:reg_exp


Set $R_REG=здесь_должно_быть_название_подраздела_реестра_из_переданной_в_функцию_строки
Set $R_VAL=здесь_должно_быть_название_параметра_реестра_из_переданной_в_функцию_строки

Set $R_TMP=HKEY_CURRENT_USER\Temp
Set $F_REG=c:\backup\reg\%count%.reg
Set $F_TMP=c:\backup\reg\%count%.tmp

Set $N=1
For %%i In (%$R_VAL%) Do Set /A $N+=1

Reg Delete "%$R_TMP%" /f >Nul 2>&1
If Exist "%$F_TMP%" DEL /F/Q "%$F_TMP%"
If Exist "%$F_REG%" DEL /F/Q "%$F_REG%"

For /F "Tokens=%$N%* Delims= " %%i In (
'REG Query "%$R_REG%" /v "%$R_VAL%"^|FindStr /IBRC:"[ ]*%$R_VAL%[ ][ ]*REG_"'
) Do REG ADD "%$R_TMP%" /v "%$R_VAL%" /t %%i /f /d "%%j" >Nul
RegEdit /E:A "%$F_TMP%" "%$R_TMP%"

For /F "Delims=:" %%i In ('FindStr /BNC:^"[^" "%$F_TMP%"') Do Set $M=%%i
For /F "Tokens=1* Delims=:" %%i In ('FindStr /BVNC:^"]^" "%$F_TMP%"') Do (
If %%i EQU %$M% (
Echo.[%$R_REG%]>>%$F_REG%
) ELSE (
Echo.%%j>>%$F_REG%
)
)

set /a count=count+1
exit /b

:end

Georgio
09-01-2016, 03:22
@echo off


for %%? in (
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\Fax\ChangeID"
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports\nul:"
"HKU\S-1-5-19\Software\Microsoft\Windows NT\CurrentVersion\Devices\Отправить в OneNote 2010"
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\Отправить в OneNote 2010\ChangeID"
) do (
call :sub %%?
)

goto :eof


:sub

setlocal

set "s=%~1"

:sub_1
for /f "tokens=1* delims=\" %%i in ("%s%") do set s=%%j& set t=%%i
if defined s ((if defined x (set "x=%x%\%t%") else (set "x=%t%"))& goto %0_1) else (set "y=%t%")

set "first_substring=%x%"
set "second_substring=%y%"

echo "%first_substring%"
echo "%second_substring%"

echo.
pause
echo.

endlocal

exit /b 0

kokos76
09-01-2016, 09:32
Georgio, Вашу идею понял, спасибо большое!! Я в своей домашне-сисадминской практике с if defined ещё не сталкивался :-) .




© OSzone.net 2001-2012