Войти

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


Страниц : [1] 2

mitiya
15-04-2008, 11:28
в общем есть ключи реестра


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

hasherfrog
15-04-2008, 12:19
Если да, то можно начать плясать вот от такого:
@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
Может, надо netsh interface show interface заменить на что-то типа REG QUERY HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles?
Я его-то не понял... :-/ »

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

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

hasherfrog
15-04-2008, 15:19
>> к примеру пути с 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
а почему в качестве разделителя не использовать бы REG_SZ ?

hasherfrog
16-04-2008, 10:36
>> а почему в качестве разделителя не использовать бы 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
очень странное что-то получается.
после отработки этой сроки (с >> ___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
тут есть еще один подводный камень - русские слова сохранятся крякозябками так как REG выводит в 1251, а CMD использует 866-ю кодировку... поэтому лучше сразу засветить цель всего мероприятия и требования, так как могут потребоваться дополнительные CMD-утилитки... или может действительно перейти на WSH?

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

amel27
17-04-2008, 13:16
надо просто скопировать нужные файлы в базы »
ну смотри, мое дело предупредить:@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
проблема с кракозяброй решается просто командой
CHCP 1251

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

amel27
17-04-2008, 17:00
проблема с кракозяброй решается просто командой CHCP 1251 »от текста на экране толку мало, главное чтобы команда дальнейшей обработки поняла кодировку
это что-то типа массива что ли ? »нет, это лишь построчный разбор входного текста и вывод на экран в цикле с промежуточным сохранением в переменных, а разве нужно что-то другое?

hasherfrog
17-04-2008, 18:20
mitiya,
но только я если честно не совсем понял что тут с переменными

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

mitiya
17-04-2008, 22:38
В итоге хотелось получить переменные вида :
path1=D:\1c\conf\proekt\
name1=proekt

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

и т.д.

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

amel27
18-04-2008, 02:47
хотелось получить переменные вида »
гм, не вижу в этом смысла... впрочем, вам видней ;)@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
вот что у меня получилось .

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

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
я так понял что переменные в переменные вкладывать нельзя »можно, один из вариантов применил в двух последних примерах (!VAR1%VAR2%!)
вот что у меня получилось »у вас работает?... у меня нет, зато работает вот это:@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
У меня руские буквы отображаются кракозяброй, но копируется все правельно .

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



@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
руские буквы отображаются кракозяброй, но копируется все правельно »гм... интересно, вот этот код вроде работает и без файлов... почему пока сам не понял :) @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




© OSzone.net 2001-2012