CMD/BAT - Разбить строку на две подстроки по последнему символу \

Ответить
Аватара пользователя
kokos76

CMD/BAT - Разбить строку на две подстроки по последнему символу \

Сообщение kokos76 »

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



Цель - подать эти значения на вход cmd-скрипта, выполняющего
CMD/BAT - [решено] Export Registry Value
от ув. 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

Re: CMD/BAT - Разбить строку на две подстроки по последнему символу \

Сообщение Georgio »

Код:

Код: Выделить всё

@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

Re: CMD/BAT - Разбить строку на две подстроки по последнему символу \

Сообщение kokos76 »

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

Вернуться в «Скриптовые языки администрирования Windows»