![]() |
синтаксис bat -ника
собственно вопрос в синтаксисе - если в цикле "если, то" команда со свитчами, надо-ли её как-то выделять? Кавычками там или скобками, чтоб исполняющий софт не понял, что команда уже закончена и надо ожидать ELSE
гугление ответа не даёт, а сам что-то склерожу совершенно жестоко. Если привязаться к конкретно скрипту, то сейчас рисую такое - (даётся лист машин с проблемами всуса, на них останавливается служба винапдейта и в зависимости от версии выни тихо и с последующим принудительным рестартом устанавливается обновление клиента винапдейта для вин 8 или 7. ) Код:
set DomainUserUPN=(мойдомен)\(админскийакк) Код:
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 Можно, конечно, выделить в goto, но неужели нет изящного в одну строку решения? это не единственная проблема, вопросы к синтаксису будут регулярно, наверно, возникать)) |
Цитата:
|
Код:
@echo off |
alpap, мне для удалённой машины... Точнее машин. Не локальной.
|
Код:
SET Node=%ComputerName% |
о, не знал, что она с сетью умеет, спасибо
хм.. попробовал.. Код:
:updWU Код:
>for /F "tokens=3" %a in ('wmic /node:(имякомпа) path Win32_Operat |
тогда уже аккуратнее так (вы все скобки растеряли):
Код:
... |
хм.. да, спасибо, так аккуратнее, но всё равно invalid global switch.
Где-то косяк в синтаксисе, но какой, не пойму.. |
bredych, попробуйте ещё:
Код:
wmic.exe /node:"%~1" path … |
но это же не имеет смысла :o
Переменная объявлялась как %1 или %i или я чего-то не знаю и такая запись равноценна первой? попробовал сменить на %%i - получил ERROR: Description = The RPC server is unavailable. попробовал от безысходности на ваше сменить - идентичный ответ. |
bredych, покажите Ваш конечный код. Упакуйте файл с образцами:
Цитата:
|
bredych,
не путайте переменную и параметр, а вообще Iska, в своем примере указал вам на возможную необходимость кавычек на случай, если имя компа "Вася Пупкин" и передается параметром без кавычек. |
Цитата alpap:
возможную необходимость кавычек » вообще говоря имена машин без пробелов, если вы об этом. Меня тильда удивила. Iska, код тот же на данный момент: Код:
@echo on Код:
D2_OZ324-5 ps, а простой перенос строки в пределах одной команды в батнике возможен вообще? Разве тогда выполнение не ограничивается первой строкой? Как я понимаю, только с добавлением символа каретки, иначе всё, что с новой строки идёт, должно восприниматься как новая команда. Хоть в логе перед выбросом ошибки всю группу цитировало, но не может в этом ошибка крыться? pps. сама конструкция wmic /node:mashinename дает ошибку invalid global switch локально работает, а с нодой http://www.computerhope.com/wmic.htm говорит, что ИД машины без слеша надо. Попробовал - отрезает кусок имени компа начиная от тире и пишет, что Alias not found при заключении имени машины в кавычки - пишет имя в кавычках целиком и алиас нот фаунд. |
ззы. и сама строка запроса wmic не содержит креденциалов, по которым бы по домену ей кто-то позволял что-то спросить.
попробовал запрос формата psinfo //computername - u user -p password - даже при админских креденциалах Цитата:
|
bredych,
Код:
@echo on wmic.exe - есть, работает? psexec.exe - работает? Выполняет что-то на другом компе Попробуйте на простых примерах (командах) сначала чтобы убедиться. |
Цитата alpap:
Цитата:
wmic os get Caption - всё ок, но стоит добавить ноду даже с фиксированным именем машины - инвалид глобал свитч. Цитата bredych: Цитата:
Цитата alpap: Цитата:
Цитата 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. |
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 - уже шиш. Без замедления пролетает строку, не давая никакого вывода. |
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, в интернете пишут:
Цитата:
Код:
wmic /NODE:"D2_OZ324-5" path Win32_OperatingSystem get Caption |
Цитата:
без кавычек имя компа - Invalid global switch Если, как читал в ссылке выше, ноду без слеша писать (потому что после неё не имя листа с компами, а само имя компа), то Alias not found вне зависимости от того, есть ли пробел перед именем компа, заключено оно в кавычки или нет. Цитата:
|
О! сработало без указания пути! уффф!
Цитата:
зато теперь странное с продолжением в уже самом скрипте.. Цитата:
|
bredych, похоже, минус (дефис) воспринимается как следующая опция.
Цитата:
|
Хм... "Execute process remotely has stopped working" и просит отправить ошибку в микрософт на попытке запуска команды инсталла апдейта. Оба раза.
То есть, с кавычками он не понимает имени вообще.. В смысле, вот так - Код:
psexec \\"%1" -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c D:\Install\SysTools\%up% /quiet /forcerestart |
bredych, ну а если вместо \\name использовать @list - список с именами?
|
Petya V4sechkin, в смысле проверку на общение? И если еррорлевел = 0, то вызывать цикл через call, а если нет, то переходить к следующему имени? Но тогда не особо представляю, как передавать в цикл переменную с текущим именем компа из листа (при ошибке, как понимаю, и без задания отдельного условия перейдет на следующее имя)
Или это про команду на инсталл? Тогда нельзя: сначала надо остановить сервисы, проверить версию выни для выбора нужного именно той машине апдейта, и только потом его пытаться инсталлить. |
Цитата:
Система не может найти указанный файл может Код:
psexec \\"%~1" -u %DomainUserUPN% -p %DomainUserPassword% -i -d -c "D:\Install\SysTools\%up%" /quiet /forcerestart Код:
@echo on Код:
psexec \\@%FLIST% ... |
Цитата:
Цитата:
|
Время: 22:32. |
Время: 22:32.
© OSzone.net 2001-