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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   как бы добавить в переменные имя ключа реестра и его значение ? (http://forum.oszone.net/showthread.php?t=105039)

mitiya 15-04-2008 11:28 781706

как бы добавить в переменные имя ключа реестра и его значение ?
 
в общем есть ключи реестра
Код:


Windows Registry Editor Version 5.00   
[HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles] 
"D:\\1c\\conf\\proekt\\"="proekt" 
"D:\\1c\\conf\\torg\\DemoDB\\"="Конфигурация \"Торговля+Склад\" Демо" 
"D:\\1c\\conf\\bir\\"="bir" 
"D:\\1c\\conf\\torg\\DB\\"="Конфигурация \"Торговля+Склад\"" 
"D:\\share\\1SBDemo\\"="Информационная База #1" 
"D:\\Копия союзOld\\2005\\"="Информационная База #2" 
"D:\\share\\496\\"="496" 
"D:\\1c\\tutor\\"="tutor"

мне бы надо получить пути (к примеру D:\\1c\\conf\\proekt\\) и названия (к примеру "proekt") в разные переменные

пытаюсь сделать это командой REG QUERY HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles

и сделать по тому же принципу как в http://forum.oszone.net/thread-67920.html

но почему то не выходит.

поидея след. строка должна бы выдать путь , но она почему-то выдает только часть его

for /f "TOKENS=1 DELIMS=REG_SZ" %%A in ('netsh interface show interface ^| find "REG_SZ"') do echo %%A %%B %%C %%D %%E %%F %%G >> ___1.tmp

hasherfrog 15-04-2008 12:01 781741

Может, надо netsh interface show interface заменить на что-то типа REG QUERY HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles?
Я его-то не понял... :-/

hasherfrog 15-04-2008 12:19 781756

Если да, то можно начать плясать вот от такого:
Код:

@for /f "tokens=1,3" %%A in ('REG QUERY HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles ^| find "REG_SZ"') do @echo %%A %%B

mitiya 15-04-2008 14:19 781854

Цитата:

Цитата hasherfrog
Может, надо netsh interface show interface заменить на что-то типа REG QUERY HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles?
Я его-то не понял... :-/ »

тут я опречатался .

но всеравно получается не то , к примеру пути с program files получаются только до program

hasherfrog 15-04-2008 15:19 781922

>> к примеру пути с program files получаются только до program

Это из-за использования пробела в качестве разделителя. Это можно решить, используя "звёздочку *" после "tokens="
Например:
Код:

@for /f "tokens=1,2*" %%A in ('REG QUERY HKEY_CURRENT_USER\Software\7-zip ^| find "REG_SZ"') do @echo %%A %%C
В этом случае имя ключа идёт в %%A, "REG_SZ" идёт в %%B (не печатается), остальное (путь, например) - в %%C.

Другое дело, что если пробел может присутствовать и в левой части, в имени ключа (что-то я там у Вас такое вижу). Я изначально предполагал, что этого не будет (если левая часть перейдёт в имя переменной в окружении, то как оно может иметь пробел?). Поэтому я сейчас не смогу ответить, как бы так всё оформить.

Может, VBS? Вроде там проще должно быть...

mitiya 16-04-2008 10:20 782400

а почему в качестве разделителя не использовать бы REG_SZ ?

hasherfrog 16-04-2008 10:36 782410

>> а почему в качестве разделителя не использовать бы REG_SZ ?

Можно. Только тут один ньюанс. После разбивки через "REG_SZ" вы получите в переменные кучу пробелов, которые как-то нужно убирать... :[ Сравните вывод:
Код:

@for /f "tokens=1,2*" %%A in ('REG QUERY HKEY_CURRENT_USER\Software\7-zip ^| find "REG_SZ"') do @echo %%A %%C

@for /f "tokens=1* delims=REG_SZ" %%A in ('REG QUERY HKEY_CURRENT_USER\Software\7-zip ^| find "REG_SZ"') do @echo %%A %%B


mitiya 16-04-2008 20:11 782803

очень странное что-то получается.
после отработки этой сроки (с >> ___1.tmp ) в ___1.tmp получилось вот что
Код:

    Path                C:\Program Files\7-zip
    Lang                ru

но если выделить ,скопировать , а потом вставить в командную строку Path с пробелами до и после , то в командную строку встовляется вот это ( Path "Application Data") .
Откуда там берется "Application Data" ?

я кстати ничего против VBS не имею , просто я ничего вних не понимаю :)

amel27 17-04-2008 05:16 783011

тут есть еще один подводный камень - русские слова сохранятся крякозябками так как REG выводит в 1251, а CMD использует 866-ю кодировку... поэтому лучше сразу засветить цель всего мероприятия и требования, так как могут потребоваться дополнительные CMD-утилитки... или может действительно перейти на WSH?

mitiya 17-04-2008 10:09 783090

Да цель мероприятия , сделать скрипт для автоматической установки отчетности в 1с , для этого надо определить пути к базам и их названия . Эти пути есть в реестре , в тех ключах которые я давал в самом начале. В остальном скрипт будет достаточно прост ибо надо просто скопировать нужные файлы в базы.

amel27 17-04-2008 13:16 783202

Цитата:

Цитата mitiya
надо просто скопировать нужные файлы в базы »

ну смотри, мое дело предупредить:
Код:

@echo off
SetLocal EnableDelayedExpansion

Set KEY="HKCU\Software\1C\1Cv7\7.7\Titles"

For /F "Tokens=1,3 Delims=        " %%i In ('Reg Query %KEY% /s^|Find "REG_SZ"') do (
        Set $PATH=%%i
        Set $NAME=%%j

        @echo.
        @echo Путь  к  файлам:!$PATH:~4!
        @echo Имя базы данных:!$NAME!
)


mitiya 17-04-2008 13:33 783220

проблема с кракозяброй решается просто командой
CHCP 1251

так-то вроде все выводит правильно, но только я если честно не совсем понял что тут с переменными , это что-то типа массива что ли ?
не могли бы вы немного пояснить код :) , пожалуйста.

amel27 17-04-2008 17:00 783373

Цитата:

Цитата mitiya
проблема с кракозяброй решается просто командой CHCP 1251 »

от текста на экране толку мало, главное чтобы команда дальнейшей обработки поняла кодировку
Цитата:

Цитата mitiya
это что-то типа массива что ли ? »

нет, это лишь построчный разбор входного текста и вывод на экран в цикле с промежуточным сохранением в переменных, а разве нужно что-то другое?

hasherfrog 17-04-2008 18:20 783431

mitiya,
но только я если честно не совсем понял что тут с переменными

Дык и мы тоже не очень поняли, чего Вы хотите получить в итоге... :]

mitiya 17-04-2008 22:38 783628

В итоге хотелось получить переменные вида :
path1=D:\1c\conf\proekt\
name1=proekt

path2=D:\1c\conf\torg\DemoDB\
name2=Конфигурация "Торговля+Склад" Демо

и т.д.

чтоб потом в эти пути и копировать нужные файлы

amel27 18-04-2008 02:47 783733

Цитата:

Цитата mitiya
хотелось получить переменные вида »

гм, не вижу в этом смысла... впрочем, вам видней ;)
Код:

@echo off
SetLocal EnableDelayedExpansion

Set $RKEY="HKCU\Software\1C\1Cv7\7.7\Titles"
Set $iMAX=0

For /F "Tokens=1,3 Delims=        " %%i In ('Reg Query %$RKEY% /s^|Find "REG_SZ"') do (
        Set /A $iMAX +=1
        Set $PATH=%%i
        Set $NAME!$iMAX!=%%j
        Set $PATH!$iMAX!=!$PATH:~4!
)

CALL :DISPLAY %$iMAX%
EXIT

:DISPLAY
        Set $iNUM=%1
:LOOP
        @echo.
        @echo $PATH%$iNUM%=!$PATH%$iNUM%!
        @echo $NAME%$iNUM%=!$NAME%$iNUM%!
       
        Set /A $iNUM-=1
        If %$iNUM% GTR 0 GOTO :LOOP
        GOTO :EOF
)


mitiya 18-04-2008 12:21 783925

вот что у меня получилось .

Там внизу где :

echo Выберете базу

set /p base=

set pathh=dpath%base%

echo %pathh%

Я пытаюсь сделать что нажав циферку 1 (к примеру) переменная pathh получила значение из переменной dpath1 , я так понял что переменные в переменные вкладывать нельзя , думаю что бы предпринять

Код:


срсз 1251

if exist "___p1.tmp" del "___p1.tmp"
if exist "___n1.tmp" del "___n1.tmp"

SetLocal EnableDelayedExpansion

Set KEY="HKCU\Software\1C\1Cv7\7.7\Titles"

For /F "Tokens=1,3 Delims=        " %%i In ('Reg Query %KEY% /s^|Find "REG_SZ"') do (
        Set $PATH=%%i
        Set $NAME=%%j

        @echo.
        @echo !$PATH:~4!>> ___p1.tmp
        @echo !$NAME!>> ___n1.tmp
)


SET N=0
for /f "tokens=* eol=" %%A in (___p1.tmp) do SET /A N+=1

set i=0
:again

if "%I%" == "%N%" goto x1

if exist "___p2.tmp" del "___p2.tmp"

if "%I%" == "0" (
  for /f "tokens=* eol=" %%A in (___p1.tmp) do (
    if not exist "___p2.tmp" (
      Set C=%%A
      echo "" > ___p2.tmp
    )
  )
) else (
 for /f "skip=%I% tokens=* eol=" %%A in (___p1.tmp) do (
    if not exist "___p2.tmp" (
      Set C=%%A
      echo "" > ___p2.tmp
    )
  )
)

set /A I+=1
SET dpath%I%=%C%
goto again





:x1
SET N=0
for /f "tokens=* eol=" %%A in (___n1.tmp) do SET /A N+=1

set i=0
:again2

if "%I%" == "%N%" goto end

if exist "___n2.tmp" del "___n2.tmp"

if "%I%" == "0" (
  for /f "tokens=* eol=" %%A in (___n1.tmp) do (
    if not exist "___n2.tmp" (
      Set C=%%A
      echo "" > ___n2.tmp
    )
  )
) else (
 for /f "skip=%I% tokens=* eol=" %%A in (___n1.tmp) do (
    if not exist "___n2.tmp" (
      Set C=%%A
      echo "" > ___n2.tmp
    )
  )
)

set /A I+=1
SET dname%I%=%C%
goto again2





:end

del ___n1.tmp
del ___n2.tmp


del ___p1.tmp
del ___p2.tmp



cls
echo ____________________
echo #  Всего баз : %N%
echo ____________________
echo #    Список баз :  #
echo #__________________#



set | find "dname"

echo Выберете базу

set /p base=

set pathh=dpath%base%

echo %pathh%

pause









:ditect


amel27 21-04-2008 12:33 785998

Цитата:

Цитата mitiya
я так понял что переменные в переменные вкладывать нельзя »

можно, один из вариантов применил в двух последних примерах (!VAR1%VAR2%!)
Цитата:

Цитата mitiya
вот что у меня получилось »

у вас работает?... у меня нет, зато работает вот это:
Код:

@Echo off
SetLocal EnableDelayedExpansion

Set $RKEY="HKCU\Software\1C\1Cv7\7.7\Titles"
Set $iMAX=0

CHCP 1251 >nul
If Exist %~dpn0.tmp DEL /F/Q %~dpn0.tmp

For /F "Tokens=1,3 Delims=        " %%i In ('Reg Query %$RKEY% /s^|Find "REG_SZ"') do (
        Set /A $iMAX +=1
        Set $PATH=%%i
        Set $PATH!$iMAX!=!$PATH:~4!

        CMD /U/C @Echo !$iMAX!: %%j>>%~dpn0.tmp
)

CHCP 866 >nul
CALL :DISPLAY

Set /P $iBase=Выберите базу:
Echo.
Echo !$PATH%$iBase%!

PAUSE
EXIT


:DISPLAY
:---
CLS
Echo ____________________
Echo  Всего баз : %$iMAX%
Echo ____________________
Echo  Список баз:
Echo.
For /F "Skip=2 Delims=" %%i IN ('CMD /U/C Find /V "ЭТОГО В ТЕКСТЕ НЕ ДОЛЖНО БЫТЬ" %~dpn0.tmp') Do Echo %%i
Echo.

GOTO :EOF

З.Ы. От русских букв в "пути" придется все-таки отказаться (имхо это проще чем наворачивать скрипт)

mitiya 22-04-2008 10:14 786512

У меня руские буквы отображаются кракозяброй, но копируется все правельно .

вот рабочий код :

Код:


@echo off

set templ=c:\
set home=%cd%

set chcp1=1251

chcp %chcp1%




if exist "%templ%___p1.tmp" del "%templ%___p1.tmp"
if exist "%templ%___n1.tmp" del "%templ%___n1.tmp"

SetLocal EnableDelayedExpansion

Set KEY="HKCU\Software\1C\1Cv7\7.7\Titles"

For /F "Tokens=1,3 Delims=        " %%i In ('Reg Query %KEY% /s^|Find "REG_SZ"') do (
        Set $PATH=%%i
        Set $NAME=%%j

        @echo.
        @echo !$PATH:~4!>> %templ%___p1.tmp
        @echo !$NAME!>> %templ%___n1.tmp
)


SET N=0
for /f "tokens=* eol=" %%A in (%templ%___p1.tmp) do SET /A N+=1

set i=0
:again

if "%I%" == "%N%" goto x1

if exist "%templ%___p2.tmp" del "%templ%___p2.tmp"

if "%I%" == "0" (
  for /f "tokens=* eol=" %%A in (%templ%___p1.tmp) do (
    if not exist "%templ%___p2.tmp" (
      Set C=%%A
      echo "" > %templ%___p2.tmp
    )
  )
) else (
 for /f "skip=%I% tokens=* eol=" %%A in (%templ%___p1.tmp) do (
    if not exist "%templ%___p2.tmp" (
      Set C=%%A
      echo "" > %templ%___p2.tmp
    )
  )
)

set /A I+=1
SET dpath%I%=%C%
goto again





:x1
SET N=0
for /f "tokens=* eol=" %%A in (%templ%___n1.tmp) do SET /A N+=1

set i=0
:again2

if "%I%" == "%N%" goto end

if exist "%templ%___n2.tmp" del "%templ%___n2.tmp"

if "%I%" == "0" (
  for /f "tokens=* eol=" %%A in (%templ%___n1.tmp) do (
    if not exist "%templ%___n2.tmp" (
      Set C=%%A
      echo "" > %templ%___n2.tmp
    )
  )
) else (
 for /f "skip=%I% tokens=* eol=" %%A in (%templ%___n1.tmp) do (
    if not exist "%templ%___n2.tmp" (
      Set C=%%A
      echo "" > %templ%___n2.tmp
    )
  )
)

set /A I+=1
SET dname%I%=%C%
goto again2





:end

del %templ%___n1.tmp
del %templ%___n2.tmp


del %templ%___p1.tmp
del %templ%___p2.tmp



cls
echo #------------------#
echo #  Всего баз : %N%
echo #------------------#
echo #    Список баз :  #
echo #------------------#
echo -
echo 0=Отменить установку


set | find "dname"

echo Выберете базу

set /p base=

if %base% LSS 1 (
set mes=Установка отменена
goto off
)

if %base% GTR %N% (
set mes=Выбрана неверная база
goto off
)



set pathh=!dpath%base%!

echo %pathh%

:ditect

find /i "Бухгалтерия" "%pathh%Release.txt"
if not %errorlevel%==0 goto off
find /i "Упрощенная система налогообложения" "%pathh%Release.txt"
if %errorlevel%==0 goto usn
find /i "Бухгалтерия для бюджетных учреждений" "%pathh%Release.txt"
if %errorlevel%==0 goto budg
goto gener


:gener
echo Общая
set vid=General
goto ystan

:usn
echo УСН
set vid=Usn
goto ystan

:budg
echo для бюджетных учреждений
set vid=budget
goto ystan


:off
cls
echo %mes%.
pause
exit

:ystan

cd /d reporting
for /D %%j in (*) do (

        echo %%j

        mkdir "%pathh%ExtForms\%%j"

        copy "%home%\reporting\%%j\%vid%\Forms.new\*.exe" "%pathh%ExtForms\%%j"
        copy "%home%\reporting\%%j\%vid%\Forms.new\ver.id" "%pathh%ExtForms\%%j"


        cd /d "%pathh%ExtForms\%%j"

        del /q SETUP_BARCODELIB.EXE

        for %%i in (*.exe) do echo y | %%i

        del *.exe
)



start %home%\fontinst.exe
set mes=Установка успешно завершена

goto off


amel27 22-04-2008 13:21 786700

Цитата:

Цитата mitiya
руские буквы отображаются кракозяброй, но копируется все правельно »

гм... интересно, вот этот код вроде работает и без файлов... почему пока сам не понял :)
Код:

@Echo off
SetLocal EnableDelayedExpansion

Set $RKEY="HKCU\Software\1C\1Cv7\7.7\Titles"
Set $iMAX=0

CHCP 1251 >nul
For /F "Tokens=1,3 Delims=        " %%i In ('Reg Query %$RKEY% /s^|Find "REG_SZ"') Do (
        Set /A $iMAX +=1
        Set $PATH=%%i
        Set $NAME!$iMAX!=%%j
        Set $PATH!$iMAX!=!$PATH:~4!
)
Set $PATH=
CHCP 866 >nul

CALL :DISPLAY %$iMAX%

Echo.
Set /P $iBase=Выберите базу:
Echo Путь к выбранной базе : "!$PATH%$iBase%!"

Echo.
PAUSE

Rem Copy *.CMD !$PATH%$iBase%!
EXIT

:DISPLAY
        CLS
        Echo ____________________
        Echo  Всего баз : %1
        Echo ____________________
        Echo  Список баз:
        Echo.
        Set $iNUM=1
:LOOP
        Echo %$iNUM%: !$NAME%$iNUM%!
       
        Set /A $iNUM+=1
        If %$iNUM% LEQ %$iMAX% GOTO :LOOP
GOTO :EOF


mitiya 22-04-2008 17:31 786901

а вот это: CHCP 1251 >nul что означает , я имею в виду " >nul " ?

и зачем перименные со знаком $ , что это дает ?

amel27 23-04-2008 11:54 787370

Цитата:

Цитата mitiya
>nul что означает »

подавление выводимых сообщений (в данном случае о текущей кодировке)
Цитата:

Цитата mitiya
зачем перименные со знаком $ »

это у меня от AutoIT =), имхо так удобней - позволяет избежать случайных совпадений с другими переменными (типа PATH)


Время: 21:57.

Время: 21:57.
© OSzone.net 2001-