Показать полную графическую версию : [решено] Без раскрытия системной переменной окружения
Здравствуйте. Есть текстовый 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"
Тогда как будет выглядеть батник, получающий исходный (большой) 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
Вообще, разрешено использовать только средства Windows, отдавая предпочтение батникам. Видимо, придется обратиться к JavaScript, если не смогу обойтись батником.
Так работает:
@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"
Вот что выводит в 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.
)
ю
Не надо пренебрегать командой @echo off. Она в моём коде не для красоты.
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
Итить!! Верхний пост невнимательно прочитал! Действительно, был в Unicode. Теперь выводит.
Вот эту строчку не смог понять:
)<"reg.reg">"new.txt"
Можете объяснить?
Кстати, команды chcp 1251>nul&& type reg.reg>reg_ANSI.reg или chcp 1251>nul&& more<reg.reg>reg_ANSI.reg решают вопрос и с перекодировкой иэ Unicode в ANSI (Windows-1251).
Спасибо! Сам точно не додумался бы!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.