Показать полную графическую версию : как бы добавить в переменные имя ключа реестра и его значение ?
в общем есть ключи реестра
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
Может, надо 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? Вроде там проще должно быть...
а почему в качестве разделителя не использовать бы 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
очень странное что-то получается.
после отработки этой сроки (с >> ___1.tmp ) в ___1.tmp получилось вот что
Path C:\Program Files\7-zip
Lang ru
но если выделить ,скопировать , а потом вставить в командную строку Path с пробелами до и после , то в командную строку встовляется вот это ( Path "Application Data") .
Откуда там берется "Application Data" ?
я кстати ничего против VBS не имею , просто я ничего вних не понимаю :)
тут есть еще один подводный камень - русские слова сохранятся крякозябками так как REG выводит в 1251, а CMD использует 866-ю кодировку... поэтому лучше сразу засветить цель всего мероприятия и требования, так как могут потребоваться дополнительные CMD-утилитки... или может действительно перейти на WSH?
Да цель мероприятия , сделать скрипт для автоматической установки отчетности в 1с , для этого надо определить пути к базам и их названия . Эти пути есть в реестре , в тех ключах которые я давал в самом начале. В остальном скрипт будет достаточно прост ибо надо просто скопировать нужные файлы в базы.
надо просто скопировать нужные файлы в базы »
ну смотри, мое дело предупредить:@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!
)
проблема с кракозяброй решается просто командой
CHCP 1251
так-то вроде все выводит правильно, но только я если честно не совсем понял что тут с переменными , это что-то типа массива что ли ?
не могли бы вы немного пояснить код :) , пожалуйста.
проблема с кракозяброй решается просто командой CHCP 1251 »от текста на экране толку мало, главное чтобы команда дальнейшей обработки поняла кодировку
это что-то типа массива что ли ? »нет, это лишь построчный разбор входного текста и вывод на экран в цикле с промежуточным сохранением в переменных, а разве нужно что-то другое?
hasherfrog
17-04-2008, 18:20
mitiya,
но только я если честно не совсем понял что тут с переменными
Дык и мы тоже не очень поняли, чего Вы хотите получить в итоге... :]
В итоге хотелось получить переменные вида :
path1=D:\1c\conf\proekt\
name1=proekt
path2=D:\1c\conf\torg\DemoDB\
name2=Конфигурация "Торговля+Склад" Демо
и т.д.
чтоб потом в эти пути и копировать нужные файлы
хотелось получить переменные вида »
гм, не вижу в этом смысла... впрочем, вам видней ;)@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
)
вот что у меня получилось .
Там внизу где :
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
я так понял что переменные в переменные вкладывать нельзя »можно, один из вариантов применил в двух последних примерах (!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
З.Ы. От русских букв в "пути" придется все-таки отказаться (имхо это проще чем наворачивать скрипт)
У меня руские буквы отображаются кракозяброй, но копируется все правельно .
вот рабочий код :
@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
руские буквы отображаются кракозяброй, но копируется все правельно »гм... интересно, вот этот код вроде работает и без файлов... почему пока сам не понял :) @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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.