Войти

Показать полную графическую версию : синтаксис bat -ника


Страниц : [1] 2

bredych
22-12-2016, 17:31
собственно вопрос в синтаксисе - если в цикле "если, то" команда со свитчами, надо-ли её как-то выделять? Кавычками там или скобками, чтоб исполняющий софт не понял, что команда уже закончена и надо ожидать 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
if /f »
:)

alpap
22-12-2016, 19:53
@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
alpap, мне для удалённой машины... Точнее машин. Не локальной.

alpap
23-12-2016, 13:13
SET Node=%ComputerName%
WMIC.EXE /Node:"%Node%" Path


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

bredych
23-12-2016, 15:51
о, не знал, что она с сетью умеет, спасибо

хм.. попробовал..
: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
тогда уже аккуратнее так (вы все скобки растеряли):

...
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
хм.. да, спасибо, так аккуратнее, но всё равно invalid global switch.
Где-то косяк в синтаксисе, но какой, не пойму..

Iska
27-12-2016, 11:34
bredych, попробуйте ещё:
wmic.exe /node:"%~1" path …

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

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

ERROR:
Description = The RPC server is unavailable.

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

Iska
27-12-2016, 17:58
bredych, покажите Ваш конечный код. Упакуйте файл с образцами:
лист машин »
в архив и приложите к сообщению.

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

bredych
27-12-2016, 20:56
Цитата 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, а простой перенос строки в пределах одной команды в батнике возможен вообще? Разве тогда выполнение не ограничивается первой строкой? Как я понимаю, только с добавлением символа каретки (http://stackoverflow.com/questions/69068/long-commands-split-over-multiple-lines-in-windows-vista-batch-bat-file), иначе всё, что с новой строки идёт, должно восприниматься как новая команда. Хоть в логе перед выбросом ошибки всю группу цитировало, но не может в этом ошибка крыться?

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

bredych
28-12-2016, 12:07
ззы. и сама строка запроса 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
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
Цитата 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
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
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
попробуйте так запустить, какой вывод? »
ничего. :(

а еще можно так попоробовать: »
alias not found. как и ранее.

Petya V4sechkin
28-12-2016, 19:44
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-адреса (без кавычек).




© OSzone.net 2001-2012