Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Поиск слова в строке из реестра

Ответить
Настройки темы
CMD/BAT - Поиск слова в строке из реестра

Новый участник


Сообщения: 14
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Доброго времени суток всем. Есть скрипт:
Код: Выделить весь код
echo on 
cls 
for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| find "ProductName"') do set ProductName=%%b


if "%ProductName%" == "Windows Server 2008 R2 Datacenter" goto noconfig
if "%ProductName%" == "Windows Server 2008 R2 Enterprice" goto noconfig
if "%ProductName%" == "Windows Server 2008 R2 Standart" goto noconfig
if "%ProductName%" == "Microsoft Windows Server 2003" goto noconfig
if "%ProductName%" == "Microsoft Windows XP" goto config 
if "%ProductName%" == "Windows 7 Ultimate" goto config
if "%ProductName%" == "Windows 7 Enterprise" goto config
if "%ProductName%" == "Windows 7 Professional" goto config
if "%ProductName%" == "Windows 7 Home Premium" goto config
if "%ProductName%" == "Windows 7 Home Basic" goto config
if "%ProductName%" == "Windows 7 Starter" goto config



:noconfig
echo Config do not need
@pause
exit 

:config 
@echo AutoConfiguration Lan DHCP Script
echo config work
@pause
Помогите пожалуйста сделать так, чтоб он не сверял всю строку целиком, а проверял только часть строки и если в ней есть слово Server, уходил в noconfig, а если нет такого слова, то в config. Это будет скрипт автоматической установки, но только на клиентские машины а не на сервера.
Части конфиг и но конфиг пока тестовые, для проверки работы первого условия

P.S. Совсем не силен в программировании, по возможности, не кидайтесь помидорами

Заранее спасибо.

Отправлено: 14:08, 22-03-2017

 

Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName  | find "ProductName" | findstr /i server && echo noconfig ||echo config

Отправлено: 14:35, 22-03-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Не проще ли вообще брать данные из HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions (значение ProductType)? Там возвожны только три значения: WinNT, LanmanNT и Server.

Отправлено: 14:53, 22-03-2017 | #3


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


greg zakharov,
Спасибо за подсказку. При таком раскладе подойдет и уже существующий, работающий скрипт

Elven,
Это работает, он правильно определяет и выдает config\noconfig. Только теперь у меня проблемы с тем, как дальше сказать скрипту уходить в шаг :config или :noconfig... Если слово сервер найдено, то переменной надо присвоить значение сервер, если нет, то например 1 и в соответствии со значением переменной идти в следующий шаг. Вот только реализовать это в коде у меня не получается... Пните ещё немного дальше?

Отправлено: 06:59, 23-03-2017 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Сиволапый:
Только теперь у меня проблемы с тем, как дальше сказать скрипту уходить в шаг :config или :noconfig... »
Код: Выделить весь код
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName  | find "ProductName" | findstr /i server && (
    rem Здесь код для noconfig
    …
) || (
    rem Здесь код для config
    …
)
и не надо ничего никому присваивать и никуда ходить.

Но, если очень уж хочется — используйте call :Метка или goto :Метка.
Код: Выделить весь код
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName  | find "ProductName" | findstr /i server && call :noconfig || call :config
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:58, 23-03-2017 | #5


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


А не могли бы Вы обьяснить логику работы? Оно работает, но не могу понять как
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName | find "ProductName" | findstr /i server - выполняется вот эта часть кода, допустим слово найдено.
&& - это значит, насколько мне известно, что то что стоит после этого, будет выполняться только если успешно выполнилось то, что стоит перед этим.
call :noconfig || call :config - дальше идет это, т.е. :конфиг будет выполняться только тогда, когда :ноконфиг выполниться не смог...
А как машина понимает, когда ей выполнять конфиг а когда ноконфиг? Ведь никаких переменных явно заданных которые бы говорили что если значение такое, делай так, если другое, эдак, нет...

Отправлено: 08:08, 24-03-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Сиволапый:
&& - это значит, насколько мне известно, что то что стоит после этого, будет выполняться только если успешно выполнилось то, что стоит перед этим. »
Нет. «&&» — оператор, который продолжает исполнение команды только в том случае, если предыдущая команда вернула нулевой код возврата (да, обычно это должно обозначать «успешно», «отсутствие ошибок» и т.п., но должно — не значит есть; не всегда и не везде). «||» — противоположный по смыслу оператор: если не нулевой код возврата.

Цитата Сиволапый:
call :noconfig || call :config - дальше идет это, т.е. :конфиг будет выполняться только тогда, когда :ноконфиг выполниться не смог... »
Рассматривайте код так:
Код: Выделить весь код
ЕСЛИ findstr.exe вернул нулевой код возврата ТО
    Вызывать процедуру по метке :noconfig
ИНАЧЕ
    Вызывать процедуру по метке :config
КОНЕЦЕСЛИ
Update: Добавлю для ясности. Что тот, что другой код из #5 можно переписать так:
Код: Выделить весь код
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName  | find "ProductName" | findstr /i server
if %errorlevel% equ 0 (
    rem Здесь код для noconfig
    …
) else (
    rem Здесь код для config
    …
)
Обращаю Ваше внимание, что именно «if %errorlevel% equ 0». Более старый формат в виде «if errorlevel 0» здесь не годится, поскольку означает «код возврата равен или больше 0», старый формат может быть использован в виде «if not errorlevel 1» — «код возврата не (равен или больше 1)».

Последний раз редактировалось Iska, 24-03-2017 в 10:20. Причина: Дополнение; описка с точкой вместо запятой.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:43, 24-03-2017 | #7


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska,
Спасибо

Отправлено: 10:08, 24-03-2017 | #8


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


В общем у меня получился вот такой вариант:
Код: Выделить весь код
echo on 
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName  | find "ProductName" | findstr /i server && call :noconfig || call :config



:noconfig
echo Config do not need
exit 

:config 
@ECHO ON
set dir=%\\172.16.10.12\PolicyInstall\
@cls
@ECHO ON

@If exist "%programfiles%/TightVNC" (
@echo Done!

) else (

@If exist "%programfiles(x86)%" (
@echo Installing: TightVNC x 64


@"%dir%tightvnc-2.8.5-gpl-setup-64bit.msi" /quiet
) else (

@echo Installing: TightVNC x 32
@"%dir%tightvnc-2.8.5-gpl-setup-32bit.msi" /quiet
)
reg.exe import "%dir%vncsrv.reg"
net stop "TightVNC Server" && net start "TightVNC Server"
@echo Done!
)
exit
Всё отлично, работает. Все ставится через GPO политики компьютера (т.к. не у всех пользователей есть админские права). Но на ХР не ставится. Где то прочитал, что в ХР сетевая установка не будет работать (хотя если руками запускать, то все ставится)... Переделал по другому, чтоб для ХР установщик копировался и запускался с диска:

Код: Выделить весь код
@echo on 
@for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| find "ProductName"') do set ProductName=%%b
@reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName  | find "ProductName" | findstr /i server && call :noconfig || call :config



:noconfig
@echo Config do not need
@exit 

:config 
@ECHO ON
@If exist "%programfiles%/TightVNC" (
@echo Done!
@pause
@exit
)

@set dir=%\\172.16.10.12\PolicyInstall\

@If "%ProductName%" == "Microsoft Windows XP" (
@echo Installing: TightVNC x 32
@xcopy "%dir%*.msi*" "%temp%/*.msi" /q /y /c
@"%temp%/tightvnc-2.8.5-gpl-setup-32bit.msi" /quiet
reg.exe import "%dir%vncsrv.reg"
net stop "TightVNC Server" && net start "TightVNC Server"
@echo Done!
@pause
@exit
)

@If exist "%programfiles(x86)%" (
@echo Installing: TightVNC x 64
@"%dir%tightvnc-2.8.5-gpl-setup-64bit.msi" /quiet
)
(
@echo Installing: TightVNC x 32
@"%dir%tightvnc-2.8.5-gpl-setup-32bit.msi" /quiet
)
reg.exe import "%dir%vncsrv.reg"
net stop "TightVNC Server" && net start "TightVNC Server"
@echo Done!
)
@pause
exit
Немного криво конечно, собрал из двух разных скриптов один Если так запускать руками, то тоже работает, на ХР копируется и ставится с диска, на 7 ставится по сети. Но через GPO в ХР опять не работает... Подскажите для ХР нужно делать какой то другой, особенный скрипт?

P.S. Паузы я понавставлял для проверки. В скрипте который на доменном контроллере пауз нету...

Отправлено: 08:41, 27-03-2017 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Сиволапый:
В общем у меня получился вот такой вариант: »
Простите, я не смог понять Вашей логики. Если существует каталог или файл "%ProgramFiles%\TightVNC" — Вы ничего не делаете. Если не существует — Вы проверяете существование каталога или файла "%ProgramFiles(x86)%". Если последний существует — устанавливаете tightvnc-2.8.5-gpl-setup-64bit.msi, иначе устанавливаете tightvnc-2.8.5-gpl-setup-32bit.msi. Для чего % в «set dir=%\\172.16.10.12\PolicyInstall\» я также не понял. Со вторым кодом ещё интереснее.

Не проще ли вместо всего этого просто назначить msi пакеты для установки посредством той же групповой политики, а из файла реестра либо сделать шаблон неуправляемой групповой политики и настроить последнюю, либо же раздавать значения из этого файла реестра предпочтениями групповой политики?

Отправлено: 09:32, 27-03-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Поиск слова в строке из реестра

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Поиск в AD по строке из внешнего файла. Gluteus Maximus Скриптовые языки администрирования Windows 1 03-09-2015 10:08
VBS/WSH/JS - поиск слова в тексте и вывод части текста после искомого слова sergey23031978 Скриптовые языки администрирования Windows 9 18-02-2015 16:54
Разное - Программа для удаления нужного слова из всех веток реестра одним кликом. Smorvel Программное обеспечение Windows 5 07-11-2013 13:39
CMD/BAT - [решено] Поиск слова в последней строке support23 Скриптовые языки администрирования Windows 5 16-08-2012 13:04
[решено] PHP, определение слова в строке foma24 Вебмастеру 3 30-05-2012 15:35




 
Переход