Компьютерный форум 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=205783)

HuppeR 28-04-2011 10:41 1667053

Как вытащить путь из реестра и подставить его в нужное место?
 
День добрый.

Сейчас мозгую на тем чтобы сделать скрипт который будет брать путь из реестра:

[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home2]
"ORACLE_HOME"="C:\\app\\username\\product\\11.2.0\\client_2"

к этому пути подставлять "\network\admin\" и копировать туда файл с заменой.

Need help/

amel27 28-04-2011 11:05 1667064

Код:

set $file=c:\TEST\file.txt
set $rkey=HKLM\SOFTWARE\ORACLE\KEY_OraClient11g_home2

for /f "tokens=2*" %%a in ('reg query "%$rkey%" /v ORACLE_HOME^|Find "REG_SZ"') do set "$path=%%b"
copy /y "%$file%" "%$path%\network\admin\"


HuppeR 28-04-2011 11:06 1667065

@echo off
set reg_path=hkcu\Console
set reg_param=WindowSize
reg query "%reg_path%" /v "%reg_param%" >1.txt
for /F "tokens=1,2,3" %%a in (1.txt) do if "%%a"=="%reg_param%" set reg_value=%%c
echo %reg_value%

Пусть вытащили, как теперь подсунуть к нему "\network\admin" ?

HuppeR 28-04-2011 11:32 1667079

amel27

Бооольшое спасибо )

volk1234 12-10-2011 18:04 1771936

Привет всем.
Не стал создавать новую тему, вопрос небольшой:

Я сделал скрипт который читает значение ключа реестра

Код:

For /F "Skip=1 Tokens=3*" %%i In ('Reg Query "%Regkey4%" /V TimeZoneKeyName') Do Set TZKN=%%i%%j
Echo %TZKN%
Pause

все успешно, но ключ состоит из трех слов разделенных пробелом: Standart Russian Time.
В переменную он передается в виде StandartRussian Time, т.е. два первых слова "слиплись". Как их разделить? :)

Iska 12-10-2011 20:20 1772003

volk1234, желательно приводить полный код, а не огрызок, дабы не надо было додумывать:
Код:

Regkey4=HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Time Zones

Попробуйте так (указав разделителем табуляцию):
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "skip=3 tokens=3 delims=        " %%i In ('reg.exe query "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Time Zones" /v TimeZoneKeyName') do set TZKN=%%i

if defined TZKN echo %TZKN%

endlocal
exit /b 0


El Sanchez 12-10-2011 21:09 1772040

volk1234, поставить пробел Set TZKN=%%i %%j:). Но skip при разборе вывода reg лучше не применять из-за разных версий reg. Чтобы выделить нужную строку в WinXP отфильтровать нужно 3 строки (как в примере Iska), ваш пример для Wn7, т.к. пропускается 1 строка да и разбить вывод надо немного иначе:
Код:

for /f "tokens=2*" %%i in ('Reg Query "%Regkey4%" /V TimeZoneKeyName 2^>nul^|find /i "REG_SZ" 2^>nul') do Set TZKN=%%j
Echo %TZKN%


volk1234 12-10-2011 23:17 1772101

El Sanchez
у Вас ошибка в скрипте- в конце должно быть %%j

Iska 13-10-2011 01:22 1772172

Цитата:

Цитата El Sanchez
Чтобы выделить нужную строку в WinXP отфильтровать нужно 3 строки (как в примере Iska), ваш пример для Wn7, т.к. пропускается 1 строка да и разбить вывод надо немного иначе: »

Угу. Тут не так давно, помнится, рассматривался этот вопрос. Может быть, даже именно Вами.

К сожалению, редко указывают окружение, в котором будет работать скрипт/пакетный файл.

volk1234 13-10-2011 10:26 1772297

Я извиняюсь, что не указал окружение - именно этот пакет должен работать в XP/2003/Vista/7/2008r2.
Я взял предложенный El Sanchez вариант и на Семерке он корректно отработал. Конечно мне надо, чтобы он отрабатывал и на других системах- эта трока самая важная- она определяет часовой пояс с которым работает пользователь и бэкапит его.

Вот полный код скрипта:
читать дальше »
Код:

@Echo off

Rem Belarus timezone change utility(UTC+3 Minsk)
Rem (c) volk1234 01/10/2011
Rem mail to volk1234@mail.ru
Rem v 0.4

:set_start_time

Set start_time=%TIME:~0,-3%
Set start_time=%start_time::=%
Set start_time=%start_time: =0%
Set start_time=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%start_time%

Rem Detecting OS,language and current tz registry key name
:DetectEnv
For /F "Skip=1 Tokens=3" %%A In ('Reg Query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language" /V InstallLanguage') Do Set OSLang=%%A

For /F "Skip=1 Tokens=3" %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V CurrentVersion') Do Set OSver=%%A

If %OSver% GTR 5.2 (
Set Regkey4=HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
) Else (
Set Regkey4=HKCU\Software\Microsoft\Windows NT\CurrentVersion\Time Zones
)

For /F "Tokens=2*" %%i In ('Reg Query "%Regkey4%" /V TimeZoneKeyName 2^>nul^|find /i "REG_SZ" 2^>nul') Do Set TZKN=%%j

Rem Setting Variables
:TZVARS

Set Regkey1=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\%TZKN%
Set Regkey2=HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
Set TZIdata="4cffffff00000000c4ffffff0000000000000000000000000000000000000000000000000000000000000000"
Set TZIdata2="88ffffff00000000c4ffffff00000a0000000500030000000000000000000300000005000200000000000000"
Set Dllres1="@tzres.dll,-1730"
Set Dllres2="@tzres.dll,-1731"
Set Dllres3="@tzres.dll,-1732"
Set DisplayEn="(UTC+03:00) Minsk"
Set DisplayRu="(UTC+03:00) ЊЁ*бЄ"
Set DltEn=Minsk Daylight Time
Set StdEn=Minsk Standard Time
Set DltRu=ЊЁ*бЄ®Ґ ўаҐ¬п («Ґв®)
Set StdRu=ЊЁ*бЄ®Ґ ўаҐ¬п (§Ё¬*)
Set Backupdir="%TEMP%\TZBY\%start_time%"
Set Regkey3=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\%StdEn%

If %OSLang%==0419 (
Set DLT=%DltRu%
Set STD=%StdRu%
Set DSPL=%DisplayRu%
Goto :Regbackup
)

If %OSLang%==0409 (
Set DLT=%DltEn%
Set STD=%StdEn%
Set DSPL=%DisplayEn%
Goto :Regbackup
)

Exit /b1

Rem Backup regisry
:Regbackup

If Not Exist %Backupdir% MD %Backupdir%

REG EXPORT "%Regkey1%" %Backupdir%\TZ.reg >nul
REG EXPORT "%Regkey2%" %Backupdir%\TZI.reg >nul

Echo @Echo Off>>%Backupdir%\restore_tz.cmd
Echo. >>%Backupdir%\restore_tz.cmd
Echo Regedit /s TZ.reg>>%Backupdir%\restore_tz.cmd
Echo Regedit /s TZI.reg>>%Backupdir%\restore_tz.cmd
Echo Reg Delete "%Regkey3%" /f>>%Backupdir%\restore_tz.cmd
Echo. >>%Backupdir%\restore_tz.cmd
If %OSver% LEQ 5.2 (
Echo Tzchange /c "%TZKN%">>%Backupdir%\restore_tz.cmd
)
If %OSver% GTR 5.2 (
Echo Tzutil /s "%TZKN%">>%Backupdir%\restore_tz.cmd
)
Echo. >>%Backupdir%\restore_tz.cmd
Echo Exit /b0>>%Backupdir%\restore_tz.cmd

Rem Main: making settings for timezone utc +0300 Minsk
:SettingTZ

REG ADD "%Regkey3%" /v Dlt /t REG_SZ /d "%StdRu%" /f >nul
REG ADD "%Regkey3%" /v Std /t REG_SZ /d "%StdRu%" /f >nul
REG ADD "%Regkey3%" /v Display /t REG_SZ /d %DSPL% /f >nul
REG ADD "%Regkey3%\Dynamic DST" /v 2010 /t REG_BINARY /d %TZIdata2% /f >nul
REG ADD "%Regkey3%\Dynamic DST" /v 2011 /t REG_BINARY /d %TZIdata% /f >nul
REG ADD "%Regkey3%\Dynamic DST" /v FirstEntry /t REG_DWORD /d 0x000007da /f >nul
REG ADD "%Regkey3%\Dynamic DST" /v LastEntry /t REG_DWORD /d 0x000007db /f >nul
REG ADD "%Regkey3%" /v TZI /t REG_BINARY /d %TZIdata% /f >nul

If %OSver% GTR 5.2 (

      REG ADD "%Regkey3%" /v MUI_Display /t REG_SZ /d %Dllres1% /f >nul
      REG ADD "%Regkey3%" /v MUI_Std /t REG_SZ /d %Dllres2% /f >nul
      REG ADD "%Regkey3%" /v MUI_Dlt /t REG_SZ /d %Dllres3% /f >nul
     
      REG ADD "%Regkey2%" /v StandardName /t REG_SZ /d %Dllres2% /f >nul
      REG ADD "%Regkey2%" /v DaylightName /t REG_SZ /d %Dllres2% /f >nul
      REG ADD "%Regkey2%" /v DynamicDaylightTimeDisabled /t REG_DWORD /d 0x00000001 /f >nul
      REG ADD "%Regkey2%" /v TimeZoneKeyName /t REG_SZ /d "%StdEn%" /f >nul
     
      tzutil /s "%StdEn%"
)

If %OSver% LEQ 5.2 (

    tzchange /c "%StdEn%"
)


Exit /b0


El Sanchez 13-10-2011 15:20 1772496


Цитата:

Цитата volk1234
у Вас ошибка в скрипте »

volk1234, спасибо.
Цитата:

Цитата volk1234
Вот полный код скрипта »

volk1234, еще в паре строк skip-ы поубирать.
Цитата:

Цитата Iska
Угу. Тут не так давно, помнится, рассматривался этот вопрос. Может быть, даже именно Вами. »

Iska, угу. Было такое, начиная отсюда

Iska 13-10-2011 18:12 1772617

El Sanchez, спасибо за ссылку.

Цитата:

Цитата volk1234
именно этот пакет должен работать в XP/2003/Vista/7/2008r2. »

Тогда лучше перейти на что-нибудь универсальное: WSH, або PowerShell.

volk1234 14-10-2011 10:16 1773021

PowerShell не установлен по умолчанию на ХР 2003, на Висте второго нет по умолчанию...

Iska 14-10-2011 12:36 1773119

Цитата:

Цитата volk1234
PowerShell не установлен по умолчанию на ХР 2003 »

Что мешает поставить?

volk1234 14-10-2011 15:12 1773233

Я в том плане, что тоже не универсальное решение, ведь кто и где будет применять скрипт не знаешь.Cmd везде работает в основном.
Хотя конечно скрипты пишутся для себя и среда их применения обычно известна.

Iska 15-10-2011 07:11 1773700

volk1234, с cmd проблем предостаточно. Прежде всего в том, что утилиты командной строки от версии к версии меняются, или вовсе отсутствуют (так же: могут быть в Support Tools/Resource Kit, а могут и не быть). Вывод утилит в разных версиях ОС может кардинально отличаться. В одной версии ОС утилита может устанавливать код возврата (по которому можно ориентироваться на результат), в другой версии — нет. Немалые отличия могут быть и в одной версии, но на разных языках… Нет, CMD — самая проблемная технология для подобного ТЗ. Что далеко ходить? Вы же сами об этом пишете в своей статье: Скрипт для изменения часовых поясов Украины, Беларуси и Армении.

Потому, на мой взгляд, лучше стараться использовать такую среду, как WSH или PoSH.


Время: 20:12.

Время: 20:12.
© OSzone.net 2001-