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

Firebolt 10-07-2009 10:19 1163623

Составить скрипт с условием
 
Вот такой вот пишу скрипт:

Код:

@ echo off  IF NOT EXIST %windir%\logo2.bmp (   
REGEDIT /S \\svrmain\prog\logonwp.reg
copy /Y \\svrmain\prog\logo2.bmp %windir%   
) ELSE ( 
exit 
)

Тут все работает, но нужно добавить нюанс. Что-то типа условия в условии. Если словами, то... Когда файл logo2 не найден, то добавить такое-то измение реестра... А потом еще одно условие: если изменение не было внесено в реестр, тогда goto end - пропускаем копирование файла logo2. Вот как это условие записать про изменения в реестре?

Petya V4sechkin 10-07-2009 10:45 1163635

Firebolt, с помощью Reg Query можно проверить (внесено ли изменение), как-то так:
Код:

REG QUERY "раздел" /V "параметр" && copy /Y \\svrmain\prog\logo2.bmp %windir%
Оператор && выполняет следующую команду в том случае, если предыдущая завершилась успешно.

Firebolt 10-07-2009 11:08 1163655

Petya V4sechkin, а почему REG QUERY? Можно мне вставить туда же в

Код:

REGEDIT /S \\svrmain\prog\logonwp.reg
copy /Y \\svrmain\prog\logo2.bmp %windir%

&& ? Чтобы получилось

Код:

REGEDIT /S \\svrmain\prog\logonwp.reg &&
copy /Y \\svrmain\prog\logo2.bmp %windir%

???

Petya V4sechkin 10-07-2009 11:18 1163660

Firebolt, потому что Regedit не возвращает ошибок (ErrorLevel = 0).
После && не должно быть перевода строки (обе команды в одной строке).

Firebolt 10-07-2009 21:48 1164269

Petya V4sechkin, чего только не пробовал, не получается у меня изменения внести в реестр. Может поможете мне? Применяю следующий твик:

Код:

"Wallpaper"="C:\\Windows\\logo2.bmp"
"WallpaperStyle"="2"
"OriginalWallpaper"="C:\\Windows\\logo2.bmp"


Petya V4sechkin 10-07-2009 22:05 1164286

Firebolt, прям так и применяете?
Почему бы в нормальном виде не сделать?
Код:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Desktop]
"Wallpaper"="C:\\Windows\\logo2.bmp"
"WallpaperStyle"="2"
"OriginalWallpaper"="C:\\Windows\\logo2.bmp"


Firebolt 10-07-2009 22:10 1164291

Petya V4sechkin, потому что мне необходимо условие - если изменения не вносятся, тогда скрипт не должен отрабатывать дальше. А если вносятся, тогда скрпит работает дальше и копирует файл. Этот файл в последствии является маркером. И при повторном запуске, если этот файл уже имеется в наличии, скрипт вообще не будет отрабатываться. Весь этот скрипт прописан в групповой политеке и запускается каждый раз при логоне пользователя. Взглянув на пример, приведенный в первом посте, вы поймете о чем я говорю. И тот пример работает уже. Но нужно поправить один нюанс, как я писал выше.

Petya V4sechkin 10-07-2009 22:15 1164294

Firebolt, фрагмент из 5-го поста не похож на фрагмент из 6-го.
Вы пишете:
Цитата:

Цитата Firebolt
не получается у меня изменения внести в реестр.

А я вам отвечаю, что твик из 6-го поста вносит изменения.

Firebolt 10-07-2009 22:20 1164300

Petya V4sechkin, у меня не получается внести изменения в реестр при помощи команды REG QUERY из командной строки! Да, мой 5 пост предполагал, что вы помните, о чем идет речь. Прошу прощения, не подумал.

В общем, я хочу внести вот эти вот изменения в реестр

Код:

[HKEY_CURRENT_USER\Control Panel\Desktop]
"Wallpaper"="C:\\Windows\\logo2.bmp"
"WallpaperStyle"="2"
"OriginalWallpaper"="C:\\Windows\\logo2.bmp"

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

Petya V4sechkin 11-07-2009 10:07 1164561

Цитата:

Цитата Firebolt
у меня не получается внести изменения в реестр при помощи команды REG QUERY из командной строки!

Команда REG QUERY для этого не предназначена.

Цитата:

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

Вернемся к началу.
Вы говорите, что REGEDIT /S файл.reg не вносит изменения в раздел "HKCU\Control Panel\Desktop", интересно, по какой причине? Разрешения изменены, что ли?

Firebolt 11-07-2009 10:14 1164564

Petya V4sechkin,
Цитата:

Цитата Petya V4sechkin
Вы говорите, что REGEDIT /S файл.reg не вносит изменения в раздел "HKCU\Control Panel\Desktop", интересно, по какой причине? Разрешения изменены, что ли? »

Ну вообще, да, пользователь имеет ограниченные групповой политикой права. Но если локально он является администратором, то все изменения вносятся. По идее, если задуматься, то получается, не имеет значения, есть ли у него права администратора локально или нет. Ведь даже если он локально и админ, то он все равно не может вносить изменения в реестр согласно групповой политике. Но вот появились подозрения, что если пользователь не имеет локально прав администратора, то при логоне изменения не вносятся. И мне сказали написать скрипт с вот таким условием, о котором я говорил выше.

Petya V4sechkin 11-07-2009 10:24 1164570

Цитата:

Цитата Firebolt
Но вот появились подозрения, что если пользователь не имеет локально прав администратора, то при логоне изменения не вносятся.

Команда:
Цитата:

Цитата Firebolt
copy /Y \\svrmain\prog\logo2.bmp %windir%

не работает, потому что обычный пользователь не имеет прав на запись в папку %windir%

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

Firebolt 11-07-2009 14:41 1164706

Petya V4sechkin,
Цитата:

Цитата Petya V4sechkin
не работает, потому что обычный пользователь не имеет прав на запись в папку %windir% »

Ну так это здорово!!! Вот мне и нужно, чтобы было вообще исключено, что эта картинка, этот файл копировался, если у пользователя нету прав на изменение реестра. Блин, ну и тупик!

Пожалуйста, просто скажите мне, как создать из командной строки в ветке реестра HKU\.DEFAULT\Control Panel\Desktop параметры
Код:

"Wallpaper"="C:\\Windows\\logo2.bmp"
"WallpaperStyle"="2"
"OriginalWallpaper"="C:\\Windows\\logo2.bmp"

Я REG ADD колбашу, но ниче не выходит. По умолчанию в ХР параметры эти все есть, просто надо дать из значения. А у меня вообще никак не получается.

Вот это вот запускаю для примера
Код:

REG ADD HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v Fignya /t REG_SZ /d D:\fignya.exe
но ничего не изменется.

Petya V4sechkin 11-07-2009 15:24 1164745

Цитата:

Цитата Firebolt
Весь этот скрипт прописан в групповой политеке и запускается каждый раз при логоне пользователя.

Стесняюсь спросить, а вы уверены, что это политика для пользователей, а не для компьютеров?

Firebolt 11-07-2009 15:42 1164759

Вложений: 1
Petya V4sechkin, вот тут все видно

sov44 12-07-2011 21:14 1712063

Не могу понять, почему не выполняется условие по выбору задания внутри условия. (кусок скрипта)
Код:

@echo off
Echo Выберите задание:
Echo.
if exist "c:\Program Files\Winrar\WinRAR.exe" (
echo 1 - установка обновлений Office 2010
echo 2 - создание самораспаковывающегося архива Office 2010
echo 3 - выход из скрипта
echo.
Set /p choice=Ваш выбор:
if "%choice%"=="1" (ping 127.0.0.1 -n 3 > nul &start Inst.cmd &&goto n2)
if "%choice%"=="2" (ping 127.0.0.1 -n 3 > nul &&goto n1)
if "%choice%"=="3" (ping 127.0.0.1 -n 3 > nul &&goto n2)

:n1
Echo.
Set /p instdate=Введите дату сборки:
...
...
)
exit
) else (
echo 1 - установка обновлений Office 2010
echo 2 - выход из скрипта
echo.
Set /p choice=Ваш выбор:
if "%choice%"=="1" (ping 127.0.0.1 -n 3 > nul &start Inst.cmd &&goto n2)
if "%choice%"=="2" (ping 127.0.0.1 -n 3 > nul &&goto n2)
)

:n2
Echo.
Echo.
Echo                            Работа скрипта закончена.
Echo              Окно командной строки закроется через некоторое время.
ping 127.0.0.1 -n 10 > nul
exit


Foreigner 12-07-2011 21:42 1712082

sov44,
На первый взгляд ошибка в том, что переменная %choice% и присваивается и проверяется в одном скрипт-блоке "if". Пример:
Код:

@echo off

:: C отложенным расширение переменных среды
setlocal enabledelayedexpansion

if "1"=="1" (

  set "var=test"
  echo 1. var=%var%
  echo 2. var=!var!

)

endlocal

:: Без отложенного расширения переменных среды
setlocal

if "1"=="1" (

  set "var=test"
  echo 3. var=%var%
  echo 4. var=!var!

)


sov44 12-07-2011 21:48 1712088

Цитата:

Цитата Foreigner
На первый взгляд ошибка в том, что переменная %choice% и присваивается и проверяется в одном скрипт-блоке "if" »

Возможно, но в этом суть проверки на наличие WinRar.

Foreigner 12-07-2011 21:56 1712095

Цитата:

Цитата sov44
Возможно, но в этом суть проверки на наличие WinRar. »

И? Переделай и все будет тип-топ:
Код:

@echo off
setlocal enabledelayedexpansion

if exist "%programfiles%\winrar\winrar.exe" (

    set /p choice="Бла-бла: "
   
    if "!choice!"=="1" .....
    if "!choice!"=="2" .....

)
....

PS. Для меню выбора лучше сразу определить значение по-умолчанию, либо при проверке введеного значения использовать if defined:
Код:

set /p choice=": "
if defined choice (

  if "%choice%"=="1" ...

)


sov44 12-07-2011 22:07 1712111

Foreigner, ушел от скобок, поменяв и добавив дополнительные пути перехода.
Код:

if exist "c:\Program Files\Winrar\WinRAR.exe" goto n1 else goto n4
задачка решена. :)

sov44 12-07-2011 22:55 1712154

Цитата:

Цитата Foreigner
при проверке введеного значения использовать if defined: »

Интересно... Как сделать, чтобы вводились и обрабатывались только цифры 1,2,3. При вводе других цифр действие не происходило.
Код:

Set /p choice=Ваш выбор:
if "%choice%"=="1" (ping 127.0.0.1 -n 3 > nul &start Inst.cmd &&goto n2)
if "%choice%"=="2" (ping 127.0.0.1 -n 3 > nul &&goto n3)
if "%choice%"=="3" (ping 127.0.0.1 -n 3 > nul &&goto n2)


Iska 13-07-2011 01:02 1712197

Цитата:

Цитата sov44
Как сделать, чтобы вводились и обрабатывались только цифры 1,2,3. При вводе других цифр действие не происходило. »

Например, так:
Код:

:Again
Set /p choice=Ваш выбор (1,2,3, …, 0 - отказ от выбора):
if "%choice%"=="1" (ping 127.0.0.1 -n 3 > nul &start Inst.cmd &&goto n2)
if "%choice%"=="2" (ping 127.0.0.1 -n 3 > nul &&goto n3)
if "%choice%"=="3" (ping 127.0.0.1 -n 3 > nul &&goto n2)

if "%choice%"=="0" goto :Out
echo Введено неверное значение
goto :Again
:Out

Если же это не учитывать, то
читать дальше »
вместо кучи if'ов проще использовать такую конструкцию:
Код:

Set /p choice=Ваш выбор:
goto :n%choice%

И, далее, в Вашем случае, наподобие:
Код:

:n1
start Inst.cmd
:n2

goto :Out

:n3

goto :Out


:Out

Или же
Код:

call :n%choice%

Foreigner 13-07-2011 06:29 1712242

Iska,
Если просто нажать Enter без значения, то получим ошибку. Поэтому либо сразу определить переменную, либо проверять if defined:
Код:

set "choice=fake"
:Again
....
:Out

Код:

:Again
Set /p choice=Ваш выбор (1,2,3, …, 0 - отказ от выбора):
if defined choice (

...

)
:Out


sov44 13-07-2011 07:11 1712249

Foreigner, я не понял, как определять каждую переменную. Помогите с написанием скрипта.

Foreigner 13-07-2011 10:17 1712323

Код:

@echo off
setlocal

:choice
set /p choice="Enter: "
if not defined choice goto:choice
if "%choice%"=="1" goto:1
if "%choice%"=="2" goto:2
if "%choice%"=="3" goto:3
goto:choice

:1
echo 1
goto:eof

:2
echo 2
goto:eof

:3
echo 3


Iska 13-07-2011 22:16 1712754

Цитата:

Цитата Foreigner
Iska, Если просто нажать Enter без значения, то получим ошибку. Поэтому … либо проверять if defined: »

Угу, надо. Забыл :).

sov44 14-07-2011 21:26 1713561

Подскажите, почему при нажатии цифры 1 скрипт работает как надо, при нажатии цифр 2 или 3 появляется надпись "Не правильно сделан выбор задания" вместо нужных переходов.
Код:

:m1
echo.
Set /p choice="Ваш выбор: "
if not defined choice goto m1
if "%choice%"=="1" (ping 127.0.0.1 -n 3 > nul &start Inst.cmd &&goto m3) else (Echo Не правильно сделан выбор задания &goto m1)
if "%choice%"=="2" (ping 127.0.0.1 -n 3 > nul &goto k) else (Echo Не правильно сделан выбор задания &goto m1)
if "%choice%"=="3" (ping 127.0.0.1 -n 3 > nul &&goto m3) else (Echo Не правильно сделан выбор задания &goto m1)

:k
....
:m3
...

Похоже поторопился с вопросом, решил :)
Код:

:m1
echo.
Set /p choice="Ваш выбор: "
if not defined choice goto m1
if "%choice%"=="1" (ping 127.0.0.1 -n 3 > nul &start Inst.cmd &&goto m3) else (
if "%choice%"=="2" (ping 127.0.0.1 -n 3 > nul &goto k) else (
if "%choice%"=="3" (ping 127.0.0.1 -n 3 > nul &&goto m3) else (Echo Не правильно сделан выбор задания &goto m1)
))
:k
....
:m3
...


Foreigner 14-07-2011 23:59 1713660

sov44,
A зачем столько вложенных if-else?
Код:

:m1
echo.
Set /p choice="Ваш выбор: "
if not defined choice goto m1
if "%choice%"=="1" ping 127.0.0.1 -n 3 > nul && start Inst.cmd && goto m3
if "%choice%"=="2" ping 127.0.0.1 -n 3 && goto k
if "%choice%"=="3" ping 127.0.0.1 -n 3 > nul && goto m3

Echo Не правильно сделан выбор задания
goto m1

:k
....
:m3
...



Время: 23:20.

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