Перейти к содержанию
СофтФорум - всё о компьютерах и не только

CMD. Вложенный цикл не работает.


Рекомендуемые сообщения

Доброго дня всем!

Давно пользуюсь двумя скриптами:

1) Получение имени группы локальных админов, независимо от языка ОС и вывод её названия

for /F %i in (compList.txt) do wmic /node:"%i" group where (sid = "S-1-5-32-544" and localaccount = true) get name | findstr /V Name

2) Получение состава этой группы. В примере группа называется по-русски.

for /f %i in (compList.txt) do wmic /Node:"%i" path win32_groupuser where (groupcomponent="win32_group.name=\"Администраторы\",domain=\"%i\"")

По отдельности всё работает.

Теперь есть желание вывод первого скрипта использовать во втором, т.е. чтобы вместо \"Администраторы\" была переменная. Вдохновлённый RSDN и трудами неизвестных мастеров конца 20-го, начала 21-го века (http://www.rsdn.ru/article/winshell/batanyca.xml ,

http://www.umachandar.com/technical/CMDScripts/Main22.htm) пробую писать нечто похожее. Но безуспешно.

Например:

for /F "usebackq " %a IN (`for /F %i in (111.txt) do wmic /node:"%i" group where (sid = "S-1-5-32-544" and localaccount = true) get name ^| findstr /V Name`) DO @echo %a

Пишет ошибку.

The system cannot find the file `for /F %i in (111.txt.

Заранее признателен за помощь.

Дмитрий.

Ссылка на комментарий
Поделиться на другие сайты

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

for /f  %%a in ('more^<compList.txt') do call :_replace %%a :_replaceset i=%*wmic /node:%i% group where (sid = "S-1-5-32-544" and localaccount = true) get name | findstr /V Name >tempset /p j=< tempwmic /Node:%i% path win32_groupuser where (groupcomponent="win32_group.name=\"%j%\",domain=\"%i%\"")
Пишет ошибку.

The system cannot find the file `for /F %i in (111.txt.

воспринимает закрывающую скобку как конец набора. Можно попробовать всю строку взять дополнительно в кавычки, но я не уверен, что сработает :bye1:

Ссылка на комментарий
Поделиться на другие сайты

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

for /f  %%a in ('more^<compList.txt') do call :_replace %%a :_replaceset i=%*wmic /node:%i% group where (sid = "S-1-5-32-544" and localaccount = true) get name | findstr /V Name >tempset /p j=< tempwmic /Node:%i% path win32_groupuser where (groupcomponent="win32_group.name=\"%j%\",domain=\"%i%\"")

воспринимает закрывающую скобку как конец набора. Можно попробовать всю строку взять дополнительно в кавычки, но я не уверен, что сработает :)

Здравствуйте, Maikll. Признателен за помощь!

1)

При отработке скрипта в файле temp оказывается слово

"Administrators ♪" (т.е. название группы, а после неё через несколько пробелов псевдосимвол вроде ноты).

Соответственно, после этого последняя строчка скрипта выглядит вот так

wmic /Node:"msk-igm1-w0001" path win32_groupuser where (groupcomponent="win32_group.name=\"Administrators \",domain=\"hostname\"")

(т.е. после названия группы несколько пробелов.)

И скрипт завершается с ошибкой "No Instance(s) Available.".

Сегодня поищу, как "откусывать" лишнее от слова в файле. Что-то попадалость на глаза.

2) В пятницу вечером колдовал над своими заготовками. Действительно, дело оказалось в кавычках. Сейчас выглядит так

for /F "usebackq " %%a in (`"wmic group where (sid = "S-1-5-32-544" and localaccount = true) get name " ^| findstr /V Name `)

do wmic path win32_groupuser where (groupcomponent="win32_group.name=\"%%a\",domain=\"myHost"")

Эх, теперь бы вместо myHost имя хоста из файла-списка вставлять. Думаю, что надо имеющуюся строку в какой-нибудь внешний цикл вставить. Но тут у меня синтаксический пробел... Пока не знаю - как организовать на CMD такие вещи. Буду самообразовываться. Если бросите ссылку на толковый учебник по этой теме или укажите хорошего автора - буду признателен. Пока нашёл Станека, ну и MSDN (RSDN). Вечером после работы поштудирую.

Ещё раз благодарю за помощь.

Ссылка на комментарий
Поделиться на другие сайты

При отработке скрипта в файле temp оказывается слово

"Administrators ♪" (т.е. название группы, а после неё через несколько пробелов псевдосимвол вроде ноты).

:D никакого символа у себя не заметил, разве что лишние пробелы в конце строки. Хотя по идее влиять при подстановке они не должны, при желании можно легко их убрать подставляя переменную таким образом %i:~0,-1% (т.е. в примере вывести без последнего одного символа)

2) В пятницу вечером колдовал над своими заготовками. Действительно, дело оказалось в кавычках. Сейчас выглядит так

for /F "usebackq " %%a in (`"wmic group where (sid = "S-1-5-32-544" and localaccount = true) get name " ^| findstr /V Name `)

do wmic path win32_groupuser where (groupcomponent="win32_group.name=\"%%a\",domain=\"myHost"")

Возможно я и ошибаюсь, но в такой реализации он работать не будет работать как планировалось поскольку не указан какой компьютер обрабатывать т.е. получается локальный (изменением значения domain=\"myHost" в данном случае ничего не добиться, нужно явно указывать обрабатываемый комп через /node: и менять его аналогично имени домена, это для одноранга справедливо, для домена не нужно)

Эх, теперь бы вместо myHost имя хоста из файла-списка вставлять.

Используем вышеприведенный код. С учетом всех вышесказанных замечаний получим

for /f  %%a in ('more^<compList.txt') do call :_replace %%a:_replaceset i=%*rem При необходимости "отрезаем" лишние пробелы подставляя i как %i:~0,-1% или меняя сколько нужно отрезать символов. Но у меня все работает и без этого for /F "usebackq " %%a in (`"wmic /node:"%i%" group where (sid = "S-1-5-32-544" and localaccount = true) get name " ^| findstr /V Name `) do wmic /node:"%i%" path win32_groupuser where (groupcomponent = "win32_group.name=\"%%a\",domain=\"%i%\"")

Если опрашиваются компьютеры в пределах одного домена, менять значение domain= нет смысла оно будет всегда равно имени домена.

Если бросите ссылку на толковый учебник по этой теме или укажите хорошего автора - буду признателен.

Собственно, таких книг очень мало, тем более на русском. Проще найти какое-либо обсуждение на форумах.

По правилам форума нельзя давать ссылки на другие ресурсы, погугли по названию "задачи на bat файлах"

Ссылка на комментарий
Поделиться на другие сайты

Maikll!

Спасибо!

Скрипт работает так, как хочется! Спасибо за терпение!

Удачи!

P.S. Хотел поднять Вам репутацию, но не смог (суда по FAQ) мне надо набрать 20 постов, чтобы манипулировать репутациями форумчан.

Мысленно поднимаю Вам репутацию на 100 баллов!

В предыдущем сообщении опечатка.

Читать так

P.S. Хотел поднять Вам репутацию, но не смог - судя по FAQ мне надо набрать 20 постов, чтобы манипулировать репутациями форумчан.

В остальном - Вам + 100 баллов :bye1:

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...