Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Без раскрытия системной переменной окружения (http://forum.oszone.net/showthread.php?t=277355)

janxp 08-02-2014 11:38 2305365

Без раскрытия системной переменной окружения
 
Здравствуйте. Есть текстовый 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 2305401

Код:

  > 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 2305448

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

Foreigner 08-02-2014 15:30 2305487

Именно батник? В чистом виде он не слишком приспособлен для обработки текста. С помощью 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 2305514

Вообще, разрешено использовать только средства Windows, отдавая предпочтение батникам. Видимо, придется обратиться к JavaScript, если не смогу обойтись батником.

Georgio 08-02-2014 17:50 2305547

Так работает:

Код:

@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 2305669

Вот что выводит в 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 2305680

Не надо пренебрегать командой
Код:

@echo off
. Она в моём коде не для красоты.

janxp 08-02-2014 23:15 2305687

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 2305701

Итить!! Верхний пост невнимательно прочитал! Действительно, был в Unicode. Теперь выводит.
Вот эту строчку не смог понять:
Код:

)<"reg.reg">"new.txt"
Можете объяснить?

Georgio 09-02-2014 01:15 2305735

Кстати, команды
Код:

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 2305775

Спасибо! Сам точно не додумался бы!


Время: 11:05.

Время: 11:05.
© OSzone.net 2001-