Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   синтаксис bat -ника (http://forum.oszone.net/showthread.php?t=321960)

bredych 22-12-2016 17:31 2697714

синтаксис bat -ника
 
собственно вопрос в синтаксисе - если в цикле "если, то" команда со свитчами, надо-ли её как-то выделять? Кавычками там или скобками, чтоб исполняющий софт не понял, что команда уже закончена и надо ожидать ELSE
гугление ответа не даёт, а сам что-то склерожу совершенно жестоко.

Если привязаться к конкретно скрипту, то сейчас рисую такое - (даётся лист машин с проблемами всуса, на них останавливается служба винапдейта и в зависимости от версии выни тихо и с последующим принудительным рестартом устанавливается обновление клиента винапдейта для вин 8 или 7. )
Код:

set DomainUserUPN=(мойдомен)\(админскийакк)
set /P DomainUserPassword=password...
set FLOG=%~n0.log
set FLIST=ADlist.txt
set w7up=Windows6.1-KB3172605-x86(WU_update).msu
set w8up=Windows8.1-KB3172614-x86(WU_update).msu
if exist %FLOG% set FLIST=%FLOG%
for /f "tokens=*" %%i in (%FLIST%) do call :updWU %%i
goto RETURN

:updWU
for %%k in ( bits,wuauserv,appidsvc,cryptsvc ) do ( psexec \\%1 -u %DomainUserUPN% - p %DomainUserPassword% net stop %%k )

для локальной машины это было бы в одну строку (только неясно, отделять ли команду со свитчами чем-то
Код:

if /f "skip=4 delims=" %%G in ('systeminfo | findstr /B /C:"OS Name" /C:"OS Version"') EQU 7 start %w7up% /quiet /forcerestart else start %w8up% /quiet /forcerestart
или вроде того, а для удаленной - вероятно, что--то вроде
Код:

if /f "skip=4 delims=" %%G in ('psinfo \\%1 -u %DomainUserUPN% - p %DomainUserPassword% kernel') EQU 7 start %w7up% /quiet /forcerestart else start %w8up% /quiet /forcerestart
и переменная должна уже тоже включать psexec с параметрами...
Можно, конечно, выделить в goto, но неужели нет изящного в одну строку решения?


это не единственная проблема, вопросы к синтаксису будут регулярно, наверно, возникать))

sov44 22-12-2016 17:42 2697717

Цитата:

Цитата bredych
if /f »

:)

alpap 22-12-2016 19:53 2697737

Код:

@echo off
for /f "tokens=3" %%a in ('wmic path Win32_OperatingSystem get Caption /value^|find "="') do if %%a==7 (echo win 7) else if %%a==8 (echo win 8)
pause


bredych 23-12-2016 09:42 2697847

alpap, мне для удалённой машины... Точнее машин. Не локальной.

alpap 23-12-2016 13:13 2697898

Код:

SET Node=%ComputerName%
WMIC.EXE /Node:"%Node%" Path

и в for после do ставите свой psexec в нужном месте условия и "удаляете" все что надо, вот только мне кажется что проблема у вас немного в другом :)

bredych 23-12-2016 15:51 2697924

о, не знал, что она с сетью умеет, спасибо

хм.. попробовал..
Код:

:updWU
for %%k in ( bits,wuauserv,appidsvc,cryptsvc ) do ( psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% net stop %%k )
 
for /f "tokens=3" %%a in ('wmic /node:%1 path Win32_OperatingSystem get Caption /value^|find "="') do if %%a==7 goto w7 else if %%a==8 goto w8
pause

:w7
psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c D:\Install\SysTools\%w7up% /quiet /forcerestart
goto returm

:w8
psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c D:\Install\SysTools\%w8up% /quiet /forcerestart
goto return

:return

- смотрю исполнение -

Код:

>for /F "tokens=3" %a in ('wmic /node:(имякомпа) path Win32_Operat
ingSystem get Caption /value|find "="') do if %a == 7 goto w7 else if %a==8 goto
 w8
Invalid Global Switch.

Вы об этом? Или еще где-то накосячено?

alpap 23-12-2016 16:20 2697927

тогда уже аккуратнее так (вы все скобки растеряли):
Код:

...
for /f "tokens=3" %%a in ('wmic /node:%1 path Win32_OperatingSystem get Caption /value^|find "="') do (
 if %%a==7 set "up=Windows6.1-KB3172605-x86(WU_update).msu"
 if %%a==8 set "up=Windows8.1-KB3172614-x86(WU_update).msu"
)
psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c D:\Install\SysTools\%up% /quiet /forcerestart
...


bredych 27-12-2016 10:43 2698699

хм.. да, спасибо, так аккуратнее, но всё равно invalid global switch.
Где-то косяк в синтаксисе, но какой, не пойму..

Iska 27-12-2016 11:34 2698712

bredych, попробуйте ещё:
Код:

wmic.exe /node:"%~1" path …

bredych 27-12-2016 17:46 2698793

но это же не имеет смысла :o
Переменная объявлялась как %1 или %i
или я чего-то не знаю и такая запись равноценна первой?

попробовал сменить на %%i - получил

ERROR:
Description = The RPC server is unavailable.

попробовал от безысходности на ваше сменить - идентичный ответ.

Iska 27-12-2016 17:58 2698795

bredych, покажите Ваш конечный код. Упакуйте файл с образцами:
Цитата:

Цитата bredych
лист машин »

в архив и приложите к сообщению.

alpap 27-12-2016 18:02 2698797

bredych,
не путайте переменную и параметр, а вообще Iska, в своем примере указал вам на возможную необходимость кавычек на случай, если имя компа "Вася Пупкин" и передается параметром без кавычек.

bredych 27-12-2016 20:56 2698867

Цитата alpap:
возможную необходимость кавычек »
вообще говоря имена машин без пробелов, если вы об этом. Меня тильда удивила.

Iska,
код тот же на данный момент:
Код:

@echo on

set DomainUserUPN=Dwrt\ADMIN1
set /P DomainUserPassword=password...
set FLOG=%~n0.log
set FLIST=AD1.txt
set w7up=Windows6.1-KB3172605-x86(WU_update).msu
set w8up=Windows8.1-KB3172614-x86(WU_update).msu
if exist %FLOG% set FLIST=%FLOG%
for /f "tokens=*" %%i in (%FLIST%) do call :updWU %%i
goto RETURN

:updWU
for %%k in ( bits,wuauserv,appidsvc,cryptsvc ) do ( psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% net stop %%k )

for /f "tokens=3" %%a in ('wmic /node:"%1" path Win32_OperatingSystem get Caption /value^|find "="') do (
 if %%a==7 set "up=Windows6.1-KB3172605-x86(WU_update).msu"
 if %%a==8 set "up=Windows8.1-KB3172614-x86(WU_update).msu"
)
psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c D:\Install\SysTools\%up% /quiet /forcerestart


:return

Лист содержит столбец имен
Код:

D2_OZ324-5
D2_OZ645-1
D2_OR420-2
D2_OG124-1

без пустых строк, пробелов, иных знаков.

ps, а простой перенос строки в пределах одной команды в батнике возможен вообще? Разве тогда выполнение не ограничивается первой строкой? Как я понимаю, только с добавлением символа каретки, иначе всё, что с новой строки идёт, должно восприниматься как новая команда. Хоть в логе перед выбросом ошибки всю группу цитировало, но не может в этом ошибка крыться?

pps. сама конструкция wmic /node:mashinename дает ошибку invalid global switch
локально работает, а с нодой
http://www.computerhope.com/wmic.htm
говорит, что ИД машины без слеша надо.
Попробовал - отрезает кусок имени компа начиная от тире и пишет, что Alias not found
при заключении имени машины в кавычки - пишет имя в кавычках целиком и алиас нот фаунд.

bredych 28-12-2016 12:07 2698981

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

попробовал запрос формата psinfo //computername - u user -p password
- даже при админских креденциалах
Цитата:

Connecting to D2_OZ324-5 ...Cannot connect to remote registry on D2_OZ324-5:
Access is denied.
Could not connect to D2_OZ324-5:
Access is denied.
без них сразу ошибку 5 access denied кидало.

alpap 28-12-2016 13:28 2699023

bredych,
Код:

@echo on
set "DomainUserUPN=Dwrt\ADMIN1"
set /p "DomainUserPassword=password... "
set "FLOG=%~n0.log"& :Задаем в переменную FLOG имя bat с расширением log
set "FLIST=AD1.txt"
set "w7up=Windows6.1-KB3172605-x86(WU_update).msu"
set "w8up=Windows8.1-KB3172614-x86(WU_update).msu"
::Проверяем существует ли файл "ИМЯ BAT.log" и переназначаем переменную, если да
if exist "%FLOG%" set "FLIST=%FLOG%"
::Если в файле "ИМЯ BAT.log" (или "AD1.txt", если "ИМЯ BAT.log" нет) перечислены в столбик имена компьютеров, то в переменной %%i будем их наблюдать и передаем первым параметром в подпрограмму
for /f "delims=" %%i in ('type "%FLIST%"') do call :updWU "%%i"
::Продолжение кода, если есть
pause& exit

:updWU
 ::psexec может читать и из файла [psexec @%FLIST% команды]
 ::Что-то останавливаем на компьютерах, правильно ли - не знаю, может какая из них цепляет что-то нужное (из двух слов - каждую в кавычки)
 for %%k in (bits,wuauserv,appidsvc,cryptsvc) do psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% net stop %%k
 ::Тильда в "%~1" нужна чтобы снять предыдущие кавычки и поставить свои, другим языком чтобы не оказалось две пары кавычек или ни одной
 for /f "tokens=3" %%a in ('wmic /node:"%~1" path Win32_OperatingSystem get Caption /value^|find "="') do (
  if %%a==7 set "up=Windows6.1-KB3172605-x86(WU_update).msu"
  if %%a==8 set "up=Windows8.1-KB3172614-x86(WU_update).msu"
 )
 psexec \\%1 -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c D:\Install\SysTools\%up% /quiet /forcerestart
exit /b

Что говорит выполнение строки 18, 20, 24
wmic.exe - есть, работает?
psexec.exe - работает? Выполняет что-то на другом компе
Попробуйте на простых примерах (командах) сначала чтобы убедиться.

bredych 28-12-2016 14:59 2699060

Цитата alpap:
Цитата:

wmic.exe - есть, работает? »
да, есть, разумеется. Как и писал выше, на строке с локальным запросом
wmic os get Caption
- всё ок, но стоит добавить ноду даже с фиксированным именем машины - инвалид глобал свитч.
Цитата bredych:
Цитата:

pps. сама конструкция wmic /node:mashinename дает ошибку invalid global switch
локально работает, а с нодой
http://www.computerhope.com/wmic.htm
говорит, что ИД машины без слеша надо.
Попробовал - отрезает кусок имени компа начиная от тире и пишет, что Alias not found
при заключении имени машины в кавычки - пишет имя в кавычках целиком и алиас нот фаунд. »
то есть, косяк где-то в именно том запросе - wmic /node:mashinename

Цитата alpap:
Цитата:

psexec.exe - работает? Выполняет что-то на другом компе »
да, разумеется, давно уже всякие мелочи на ней леплю, потому хотел изначально и это с ней же делать.
Цитата alpap:
Цитата:

Что-то останавливаем на компьютерах, правильно ли - не знаю, »
это сервисы винапдейта. Чтоб обновить сам клиент винапдейта, надо остановить их, иначе доступа не будет к занятым файлам. Лень искать страницу на мс, где было описано.

В лог в данном скрипте ничего не пишется, потому как не задано нигде, чего писать. Обозначение лога в шапку кинул на случай позднейшего разрастания и дебаггинга. Если кинуть перенаправление вывода той строки с запросом wmic в лог, то получаю инвалид глобал свитч вне зависимости от конструкции снаружи запроса и обозначения переменной внутри:

for /F "tokens=3" %a in ('wmic /node:D2_OZ324-5 path Win32_OperatingSystem get Caption /value|find "="') do if %a == 7 goto w7 else if %a==8 goto w8
Invalid Global Switch.

for /F "tokens=3" %a in ('wmic /node:D2_OZ324-5 path Win32_OperatingSystem get Caption /value|find "="') do (
if %a == 7 set "up=Windows6.1-KB3172605-x86(WU_update).msu"
if %a == 8 set "up=Windows8.1-KB3172614-x86(WU_update).msu"
)
Invalid Global Switch.

bredych 28-12-2016 15:28 2699069

psexec \\computername -u user -p password -s cmd /c systeminfo | findstr /B /C:"OS Name"
даёт нужную строку с чужого компа (хоть эта конструкция на костылях и тормозит секунд 20), но если пытаться играться с выводом этой строки
for /f "skip=4 delims=" %%G in ('psexec \\computername -u user -p password -s cmd /c systeminfo | findstr /B /C:"OS Name"') do echo %%G
- уже шиш. Без замедления пролетает строку, не давая никакого вывода.

alpap 28-12-2016 16:01 2699089

bredych,
попробуйте так запустить, какой вывод?
Код:

for /f "delims=" %%G in ('"psexec \\computername -u user -p password -s cmd /c systeminfo | findstr /B /C:"OS Name""') do echo %%G
запуск из батника!

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

wmic /node:"Comp"
а еще можно так попоробовать:
Код:

wmic /user:"Admin" /password:"admpass" /node:"Comp"

bredych 28-12-2016 16:49 2699112

Цитата:

Цитата alpap
попробуйте так запустить, какой вывод? »

ничего. :(

Цитата:

Цитата alpap
а еще можно так попоробовать: »

alias not found. как и ранее.

Petya V4sechkin 28-12-2016 19:44 2699186

bredych, в интернете пишут:
Цитата:

If you get "Invalid global switch" error check to see if your computer name is within quotes and USER, PASSWORD and NODE are UPPERCASE letters otherwise it won't work ( it didn't when i tried )
Так не пашет?
Код:

wmic /NODE:"D2_OZ324-5" path Win32_OperatingSystem get Caption
В крайнем случае можно заменить имена на IP-адреса (без кавычек).

bredych 29-12-2016 09:36 2699274

Цитата:

Цитата Petya V4sechkin
Так не пашет? »

Invalid verb
без кавычек имя компа - Invalid global switch

Если, как читал в ссылке выше, ноду без слеша писать (потому что после неё не имя листа с компами, а само имя компа), то
Alias not found
вне зависимости от того, есть ли пробел перед именем компа, заключено оно в кавычки или нет.

Цитата:

Цитата Petya V4sechkin
В крайнем случае можно заменить имена на IP-адреса »

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

bredych 29-12-2016 10:11 2699278

О! сработало без указания пути! уффф!

Цитата:

wmic /USER:"юзер" /PASSWORD:"пароль" /NODE:"имякомпа" os get Caption
спасибо!

зато теперь странное с продолжением в уже самом скрипте..

Цитата:

D:\bats\Bats>psexec \\D2_OZ324-5 -u (domain\user) -p (password) -i -d -c D:\Ins
tall\SysTools\Windows6.1-KB3172605-x86(WU_update).msu /quiet /forcerestart

PsExec v1.94 - Execute processes remotely
Copyright (C) 2001-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

Copying D:\Install\SysTools\Windows6.1-KB3172605-x86(WU_update).msu to D2_OZ324
Starting D:\Install\SysTools\Windows6.1-KB3172605-x86(WU_update).msu on D2_OZ324

PsExec could not start Windows6.1-KB3172605-x86(WU_update).msu on D2_OZ324-5:
The system cannot find the file specified.
имена компов чтоль в кавычках еще давать, чтоб окончание не отрезал? Никогда ж не требовалось, или я совсем склерожу?

Petya V4sechkin 29-12-2016 10:19 2699283

bredych, похоже, минус (дефис) воспринимается как следующая опция.
Цитата:

имена компов чтоль в кавычках еще давать, чтоб окончание не отрезал?
Попробуйте.

bredych 29-12-2016 11:15 2699295

Хм... "Execute process remotely has stopped working" и просит отправить ошибку в микрософт на попытке запуска команды инсталла апдейта. Оба раза.
То есть, с кавычками он не понимает имени вообще..
В смысле, вот так -
Код:

psexec \\"%1" -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c D:\Install\SysTools\%up% /quiet /forcerestart
напомните еще, в какую точку перенаправлять из цикла по %errorlevel% NEQ 0 в ответ на первую же команду в цикле в случае, если комп не онлайн в данный момент? Чтоб не выходило из цикла, а просто следующее имя брало. А то пинает-пинает каждую молчащую тушку по каждой команде.. времени жалко..

Petya V4sechkin 29-12-2016 11:19 2699296

bredych, ну а если вместо \\name использовать @list - список с именами?

bredych 29-12-2016 11:34 2699301

Petya V4sechkin, в смысле проверку на общение? И если еррорлевел = 0, то вызывать цикл через call, а если нет, то переходить к следующему имени? Но тогда не особо представляю, как передавать в цикл переменную с текущим именем компа из листа (при ошибке, как понимаю, и без задания отдельного условия перейдет на следующее имя)

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

alpap 29-12-2016 12:29 2699322

Цитата:

Цитата bredych
The system cannot find the file specified »

вообще-то:
Система не может найти указанный файл

может
Код:

psexec \\"%~1" -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c "D:\Install\SysTools\%up%" /quiet /forcerestart
и что показывает просто команда
Код:

@echo on
set "w7up=Windows6.1-KB3172605-x86(WU_update).msu"
set "w8up=Windows8.1-KB3172614-x86(WU_update).msu"
if exist "D:\Install\SysTools\%w7up%" echo "D:\Install\SysTools\%w7up%"
if exist "D:\Install\SysTools\%w8up%" echo "D:\Install\SysTools\%w8up%"
pause

и как советовал Petya V4sechkin, что дает: (конкретно для вашего кода, в переменной FLIST файл со списком имен компьютеров):
Код:

psexec \\@%FLIST% ...
для верности лучше вживую: psexec \\@ИМЯ ФАЙЛА.расш ...

bredych 29-12-2016 15:05 2699365

Цитата:

Цитата alpap
Система не может найти указанный файл »

потому что копирует его не на указанный комп, а неизвестно куда. И неизвестно откуда пытается запустить. Ну хоть чуть-чуть внимательности..
Цитата:

Цитата alpap
что дает: (конкретно для вашего кода, в переменной FLIST файл со списком имен компьютеров): »

нельзя. писал же. Это машины, на которых работают люди. Сейчас работают. Удаленно делаю еще и потому, что работы у них много и отрывать их крайне нежелательно. Тем более, чтоб потом ходить смотреть, что у них за ошибки полезут после игр.


Время: 22:32.

Время: 22:32.
© OSzone.net 2001-