Войти

Показать полную графическую версию : [решено] Без раскрытия системной переменной окружения


janxp
08-02-2014, 11:38
Здравствуйте. Есть текстовый reg-файл, со сточками, содержащими системные переменные, например:
@="\"%ProgramFiles%\\FastStone Image Viewer\\FSViewer.exe\" \"%1\""
Нужно заменить %ProgramFiles% на %ProgramFiles(x86)%. При замене с использованием батника, системные переменные раскрываются и получается:
@="\"C:\Program Files(x86)\\FastStone Image Viewer\\FSViewer.exe\" \"\""
А надо:
@="\"%ProgramFiles(x86)%\\FastStone Image Viewer\\FSViewer.exe\" \"%1\""

Батник, найденный в просторах Интернета, такой:
for /f "tokens=*" %%a in ('more^<reg.reg') do call :_replace "%%a"
goto eof
:_replace
set i=%*
set i=%i:Program Files=Program Files(x86)%
echo %i%>>new.txt
goto eof
:eof

Foreigner
08-02-2014, 12:42
> reg add "hkcu\test" /v test /d "\"^%ProgramFiles(x86)^%\"" /f
Операция успешно завершена.

> reg query hkcu\test

HKEY_CURRENT_USER\test
test REG_SZ "%ProgramFiles(x86)%"

> reg add "hkcu\test" /v test /d "\"^%ProgramFiles(x86)^%\FastStone Image Viewer\FSViewer.exe\" \"%1\"" /f
Операция успешно завершена.

> reg query hkcu\test

HKEY_CURRENT_USER\test
test REG_SZ "%ProgramFiles(x86)%\FastStone Image Viewer\FSViewer.exe" "%1"

janxp
08-02-2014, 13:53
Тогда как будет выглядеть батник, получающий исходный (большой) reg-файл содержащий системные переменные и выдающий другой reg-файл, в котором конкретные системный переменные или другой текст заменен на другие системные переменные или текст?

Foreigner
08-02-2014, 15:30
Именно батник? В чистом виде он не слишком приспособлен для обработки текста. С помощью sed:

@echo off
setlocal

set "f=1.reg"
set "s=ProgramFiles%%"
set "r=ProgramFiles(x86)%%"

1>reg.tmp sed "s/%s%/%r%/g" "%f%"
move reg.tmp "%f%"

ЗЫ. reg-файл должен быть ANSI

janxp
08-02-2014, 16:44
Вообще, разрешено использовать только средства Windows, отдавая предпочтение батникам. Видимо, придется обратиться к JavaScript, если не смогу обойтись батником.

Georgio
08-02-2014, 17:50
Так работает:

@echo off
for /f %%i in ('find /c /v ""^<"reg.reg"') do set n=%%i
(
for /l %%i in (1 1 %n%) do (
set string=
set /p string=
if defined string (
call set /p="%%string:Program Files=Program Files(x86)%%"<nul
if %%i==%n% (
goto:eof
)
)
echo.
)
)<"reg.reg">"new.txt"

janxp
08-02-2014, 22:37
Вот что выводит в new.txt:

D:\System\Flash\Utils\!!! - Copy\FastStone Image Viewer 4.9\Data>(
set string=
set /p string=
if defined string (
call set /p="%string:Program Files=Program Files(x86)%" 0<nul
if 1 == 1 (goto:eof)
)
echo.
)
ю

Georgio
08-02-2014, 22:59
Не надо пренебрегать командой @echo off. Она в моём коде не для красоты.

janxp
08-02-2014, 23:15
C echo off выводил это:
ю@


Поэтому и попробовал убрать.

Вот здесь он запоминает неправильное значение числа строк:
for /f %%i in ('find /c /v ""^<"reg.reg"') do set n=%%i
В n помещается '---------'.
Набираю в командной строке
find /c /v "^<" reg.reg
Получаю
---------- REG.REG: 2

janxp
08-02-2014, 23:35
Итить!! Верхний пост невнимательно прочитал! Действительно, был в Unicode. Теперь выводит.
Вот эту строчку не смог понять:
)<"reg.reg">"new.txt"
Можете объяснить?

Georgio
09-02-2014, 01:15
Кстати, команды chcp 1251>nul&& type reg.reg>reg_ANSI.reg или chcp 1251>nul&& more<reg.reg>reg_ANSI.reg решают вопрос и с перекодировкой иэ Unicode в ANSI (Windows-1251).

janxp
09-02-2014, 06:35
Спасибо! Сам точно не додумался бы!




© OSzone.net 2001-2012