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

Nilf 25-06-2021 08:45 2960844

Работа с циклом
 
Всем доброго времени суток!

Господа, в продолжении темы http://forum.oszone.net/thread-349049.html.

Навоял вот такую штуку, но она не спешит работать, подскажите пожалуйста, где косяк? Все наверняка очень плохо, и проблемы с синтаксисом.
Идея заключается в том чтобы забирать из текстового файла IP адреса, и подставлять их в цикл, для автоматического удаленного заведения пользователей сразу на нескольких удаленных ПК.

Код:

echo off

echo Введите имя пользователя
set /p username=
 
echo Введите пароль
set /p password=

echo Введите имя нового пользователя
set /p newuser=

echo Введите пароль нового пользователя
set /p newpass=

rem количество переменных (ip) считывается из файла
for /f "usebackq" %%S in (`find /c /v ""^<"ip.txt"`) do (set /a NumStr=%%S)

rem забирает в переменную ipinfile значение из файла IP.txt

:M2
if [NOT] NumStr = 0 goto M0
goto M1
:M0
for /f "skip=%NumStr% - 1" %%A IN ("IP.txt") do (set "ipinfile=%%~A"&&goto:M3)
:M3
set /a NumStr = NumStr - 1

wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% %newpass%"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Администраторы %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Administrators %newuser% /add"

goto M2
:M1
pause


alpap 25-06-2021 11:01 2960850

Nilf, чем больше вы будете усложнять код и себе работу тем больше у вас будет проблем и непонимания
зачем вот это
Цитата:

Цитата Nilf
echo Введите имя пользователя
set /p username=
echo Введите пароль
set /p password=
echo Введите имя нового пользователя
set /p newuser=
echo Введите пароль нового пользователя
set /p newpass= »

если есть какой-то мифический "IP.txt". Почему мифический - никто его не видел, что в нем, как это там записано чтобы проверить правильно ли вы считываете из него информацию. О его необходимости выше сказал, что-то одно только нужно, код делается для автоматизации и упрощения работы, это не должен быть комбайн со стразами.

Elven 25-06-2021 11:12 2960851

Ядрёны поммидоры, а зачем goto? И зачем перебирать файл с ip для выяснения количества оных, если все равно используются все?
Особо доставило вот это вот:
Код:

for /f "skip=%NumStr% - 1" %%A IN ("IP.txt") do (set "ipinfile=%%~A"&&goto:M3)
:M3
set /a NumStr = NumStr - 1

Т.е. выяснить количество IP, перебирать файл с ними каждый раз ПОЛНОСТЬЮ но брать только одно значение и уменьшать в следующий раз количество пропускаемых строк, а последующие итерации обламываются безусловным переходом.
Это я, извините, на эмоциях написал, но оно - правда. Теперь собственно к делу, из скрипта удаляем к лешему начиная с rem количество переменных (ip) считывается из файла
до pause, оставляем только это:
Код:

for /f %%A IN ("IP.txt") do (
set "ipinfile=%%~A"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% %newpass%"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Администраторы %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Administrators %newuser% /add"
)

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

еще один момент, вот это
Код:

set "ipinfile=%%~A"
тоже является лишним, т.к. можно %%~A подставлять прямо в строчки с wmic, но это уже на усмотрение ТСа.

alpap, согласен. Судя по тому что ТС пытается сделать - у него одноранговая сеть с одинаковой учеткой с правами администратора на хостах, но я откровенно устал писать что запуск подобной, эмммм... автоматизации в одноранговой сети штука довольно спорная и геморная, если так уж хочется выстрелить себе в ногу - кто я такой чтобы мешать? В конце концов сами мы тоже когда-то по граблям ходили, однако помочь с мягкими насадками на рукоять - в наших силах.

Ну и насчет насадок на грабли: есть такая хорошая и полезная штука как ansible - с ней возня в одноранговой сети (если уж нет возможности AD) становится чуть менее болезненной.

alpap 25-06-2021 11:15 2960852

непонятно видимо?
Если собираетесь считывать информацию из файла, то только там и должна быть вся информация, причем в таком примерно виде
Код:

192.168.31.2,Vasya,12345
192.168.31.5,Petya,67890
...


Nilf 25-06-2021 11:27 2960853

Ок. Понял.

Пример файла IP.txt:

192.168.31.1
192.168.31.2
192.168.31.3
192.168.31.4
....

Т.е. происходит банальное перечисление IP адресов на которые нужно отправить команду о добавлении нового пользователя. одна строка - один IP. Идея была такова что считается количество строк из файла, это значение подставляется в цикл, и по итог когда это значение придет к нулю (т.е. закончиться перебор всех строк) исполнение файла заканчивается.

Цитата:

Nilf, чем больше вы будете усложнять код и себе работу тем больше у вас будет проблем и непонимания
зачем вот это
Цитата Nilf:
echo Введите имя пользователя
set /p username=
echo Введите пароль
set /p password=
echo Введите имя нового пользователя
set /p newuser=
echo Введите пароль нового пользователя
set /p newpass= »
Касаемо этого, мне необходимо задавать логин и пароль нового пользователя, плюс логин и пароль пользователя-администратора, под которым будет запускаться скрипт на удаленном ПК.

Nilf 25-06-2021 12:03 2960855

Цитата:

Цитата Elven
ansible »

Спасибо за разъяснение, будем попробовать. А по поводу того чтобы юзать сторонний софт, к сожалению не получиться, есть такое ограничений что только встроенными в ОС средствами.

Цитата:

непонятно видимо?
Если собираетесь считывать информацию из файла, то только там и должна быть вся информация, причем в таком примерно виде
Код:Выделить весь код
192.168.31.2,Vasya,12345
192.168.31.5,Petya,67890
...
У меня там только IP было.

alpap 25-06-2021 12:27 2960857

Цитата:

Цитата Nilf
закончиться перебор всех строк »

не нужно этого, цикл и так прекратится
Цитата:

Цитата Nilf
перечисление IP адресов на которые нужно отправить команду о добавлении нового пользователя. одна строка - один IP »

ха, а если на одну машину надо несколько пользователей, я не просто так предложил свой вариант txt, например так может ведь быть?
Код:

192.168.31.1,Vasya,1234
192.168.31.1,Petya,5678
192.168.31.1,Olya,4321
192.168.31.2,Oleg,A1B1C1

но это все подойдет только если пользователи создаются одинаковые
иначе надо составлять файл примерно так:
Код:

Vasya,1234,192.168.31.1,net user UserNew1
Petya,5678,192.168.31.1,net user UserNew2 3476
Olya,4321,192.168.31.1,net localgroup Администраторы UserN
Oleg,A1B1C1,192.168.31.2,net localgroup Administrators NewUser2

тогда код будет выглядеть довольно просто:
Код:

@echo off
for /f "usebackq tokens=1-3* delims=," %%a in ("IP.txt") do (
  wmic /user:"%%~a" /password:"%%~b" /node:"%%~c" process call create "cmd /c %%~d /add"
)
pause


Nilf 25-06-2021 13:17 2960862

Цитата:

Цитата alpap
Цитата Nilf:
перечисление IP адресов на которые нужно отправить команду о добавлении нового пользователя. одна строка - один IP »
ха, а если на одну машину надо несколько пользователей, я не просто так предложил свой вариант txt, например так может ведь быть? »

Да, действительно, так куда удобнее получиться в таком случае, спасибо!

Nilf 25-06-2021 15:14 2960876

Цитата:

Цитата Elven
еперь собственно к делу, из скрипта удаляем к лешему начиная с rem количество переменных (ip) считывается из файла
до pause, оставляем только это:
Код:
for /f %%A IN ("IP.txt") do (
set "ipinfile=%%~A"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net user %newuser% %newpass%"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Администраторы %newuser% /add"
wmic /user:"%username%" /password:"%password%"/node:"%ipinfile%" process call create "cmd /c net localgroup Administrators %newuser% /add"
)
ну и комментарии по желанию можно оставить.
Протестить негде, но вроде как если всё остальное в порядке - должно работать. »

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

Elven 25-06-2021 15:24 2960877

у меня нет под рукой cmd чтобы проверить наверняка. больше всего похоже на какие-то грабли с переменной/переменными.
для проверки значения можно вывести все используемые переменные, например так:
Код:

echo ipinfile = %ipinfile%
echo username = %username%

ну и так далее.
но скорей всего дело в set, вроде бы в нем кавычки не нужны, т.е.
Код:

set ipinfile=%%~A

megaloman 25-06-2021 16:06 2960880

Цитата:

Цитата ip.txt
192.168.31.1
192.168.31.2
192.168.31.3
192.168.31.4

Код:

@Echo Off
Set "IpTxt=Z:\Box_In\Ip.txt"
:nameuser
        cls
        SET /P "nameuser=Введите имя пользователя                >"
        SET /P "password=Введите пароль пользователя %nameuser%        >"
        Echo Введенное имя пользователя "%nameuser%"
        Echo.
       
        :newuser
                SET /P "newuser=Введите имя нового пользователя                        >"
                SET /P "newpass=Введите пароль нового пользователя %newuser%        >"

                Cls.
                Echo Введенное имя пользователя "%nameuser%"
                Echo Введенное имя нового пользователя "%newuser%" "%newpass%"
                Echo.

                CHOICE /C NUCB /N /M "N-новый пользователь, U-пользователь, C-завершить, B-сделать"
                :begin
                        If %ErrorLevel%==1 GoTo :newuser
                        If %ErrorLevel%==2 GoTo :nameuser
                        If %ErrorLevel%==3 Exit /B
                        For /f "usebackq tokens=1 delims= " %%i in ("%IpTxt%") Do (
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net user %newuser% /add"
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net user %newuser% %newpass%"
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net localgroup Администраторы %newuser% /add"
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net localgroup Administrators %newuser% /add"
                        )
                Echo.         
                CHOICE /C NUC /N /M "N-новый пользователь, U-пользователь, C-завершить"
                CLS         

                GoTo :begin
Exit /B 0

В боевой версии Echo уберите

alpap 25-06-2021 19:20 2960903

megaloman, нельзя брать имя %username%, это имя переопределит система в cmd и не будет выхода на удаленные компьютеры, останемся на локальном юзере.

megaloman 25-06-2021 19:54 2960907

alpap, Не вспомнил %username%, наверное возможны неприятности, жара в 36 градусов сказывается. Потестировал, но не так всё просто, не очень-то переопределяется. При перезапуске окна CMD всё возвращается на круги своя. На всякий случай исправил.

Iska 26-06-2021 09:16 2960940

Поэтому iCount, sUserName, sPassword, aNames и т.п.

megaloman 26-06-2021 09:29 2960946

Iska, Вы конечно правы, стиль, батюшка, это всё!
Цитата:

Цитата Декарт
Верно определяйте слова, и вы освободите мир от половины недоразумений.


megaloman 26-06-2021 09:58 2960950

Iska, alpap, Вообще-то что касается аккуратности и осмотрительности, то, ИМХО, было бы полезным применять SetLocal. Это может избавить от последствий недомыслия при образовании имен переменных.
Код:

@Echo Off
cls
        Echo 1111  %UserName%
SetLocal
        Echo 2222  %UserName%

        Set "UserName=kuku"

        Echo 3333  %UserName%
EndLocal
        Echo 4444  %UserName%
pause
Exit /B


Iska 26-06-2021 10:45 2960957

megaloman, конечно. У меня прям шаблон под это дело задан в Far Manager'е при создании пакетного файла:
Скрытый текст

megaloman 26-06-2021 11:15 2960958

Iska, Шаблон - это конечно полезно. Теперь я понимаю (постоянно недоумевал), почему у Ваших CMD всегда упорно присутствуют
SetLocal EnableExtensions EnableDelayedExpansion
Тут бы я не согласился: SetLocal - полезно
А вот EnableDelayedExpansion я стараюсь всеми силами избегать: как-то споткнулся, что в именах файлов присутствовали "!"
С фаром, конечно, удобно: Вы запускаете bat-файл, открывается CMD-окно, Вы бесчинствуете, переопределяете переменные окружения, затем, после завершения сценария CMD-окно закрывается и все эти бесчинства отменяются.
При работе в CMD-окне, запущенного, допкустим, в пуске, если не перезапускать его, получим переопределённые для этого сеанса CMD переменные окружения.

Nilf 28-06-2021 07:31 2961018

Цитата:

Цитата megaloman
Цитата ip.txt:
192.168.31.1
192.168.31.2
192.168.31.3
192.168.31.4
Код:
@Echo Off
Set "IpTxt=Z:\Box_In\Ip.txt"
:nameuser
cls
SET /P "nameuser=Введите имя пользователя >"
SET /P "password=Введите пароль пользователя %nameuser% >"
Echo Введенное имя пользователя "%nameuser%"
Echo.
:newuser
SET /P "newuser=Введите имя нового пользователя >"
SET /P "newpass=Введите пароль нового пользователя %newuser% >"
Cls.
Echo Введенное имя пользователя "%nameuser%"
Echo Введенное имя нового пользователя "%newuser%" "%newpass%"
Echo.
CHOICE /C NUCB /N /M "N-новый пользователь, U-пользователь, C-завершить, B-сделать"
:begin
If %ErrorLevel%==1 GoTo :newuser
If %ErrorLevel%==2 GoTo :nameuser
If %ErrorLevel%==3 Exit /B
For /f "usebackq tokens=1 delims= " %%i in ("%IpTxt%") Do (
Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net user %newuser% /add"
Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net user %newuser% %newpass%"
Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net localgroup Администраторы %newuser% /add"
Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net localgroup Administrators %newuser% /add"
)
Echo.
CHOICE /C NUC /N /M "N-новый пользователь, U-пользователь, C-завершить"
CLS
GoTo :begin
Exit /B 0
В боевой версии Echo уберите »

Большое спасибо за Ваш вариант! Но получается что мне будет необходим тогда файлик choise.exe либо choise.com? Ежили его не будет, в случае например с XP, то ничего работать не будет? А если этот файлик воткнуть из ранней в позднюю или наоборот, то он не сможет выполниться, будет говорить что это не системная программа.

megaloman 28-06-2021 12:48 2961043

Nilf, Солнце встало, сдохли мухи: продолжаем в том же духе :jester:
Всё то же самое, сделан аналог Choice на Set
Код:

@Echo Off
Set "IpTxt=Z:\Box_In\Ip.txt"
:nameuser
        cls
        SET /P "nameuser=Введите имя пользователя                >"
        SET /P "password=Введите пароль пользователя %nameuser%        >"
        Echo Введенное имя пользователя "%nameuser%"
        Echo.
       
        :newuser
                SET /P "newuser=Введите имя нового пользователя                        >"
                SET /P "newpass=Введите пароль нового пользователя %newuser%        >"

                Cls.
                Echo Введенное имя пользователя "%nameuser%"
                Echo Введенное имя нового пользователя "%newuser%" "%newpass%"
                Echo.

                :Choice1
                Set "Answer="
                Set /P "Answer=Введите N-новый пользователь, U-пользователь, C-завершить, B-сделать >"

                :begin
                        If /I "%Answer%"=="N" GoTo :newuser
                        If /I "%Answer%"=="U" GoTo :nameuser
                        If /I "%Answer%"=="C" Exit /B
                        If /I Not "%Answer%"=="B" (Echo Ввод неверный: "%Answer%" &GoTo :Choice1)

                        For /f "usebackq tokens=1 delims= " %%i in ("%IpTxt%") Do (
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net user %newuser% /add"
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net user %newuser% %newpass%"
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net localgroup Администраторы %newuser% /add"
                                Echo wmic /user:"%nameuser%" /password:"%password%"/node:"%%i" process call create "cmd /c net localgroup Administrators %newuser% /add"
                        )
                Echo.

                :Choice2         
                Set "Answer="
                Set /P "Answer=Введите N-новый пользователь, U-пользователь, C-завершить >"
                        CLS         
                        If /I Not "%Answer%"=="N" If /I Not "%Answer%"=="U" If /I Not "%Answer%"=="C" (Echo Ввод неверный: "%Answer%" &GoTo :Choice2)

                GoTo :begin
Exit /B 0

В XP вроде бы выполняется (WMIC не тестировал)

Iska 28-06-2021 18:34 2961064

Цитата:

Цитата megaloman
как-то споткнулся, что в именах файлов присутствовали "!" »

1. Я не пользую ! в именах файлов.
2. Отчасти из-за этого я пользую либо WSH, либо PoSH, посему пока не сталкивался с подобной проблемой даже на сторонних файлах.

Цитата:

Цитата megaloman
С фаром, конечно, удобно: Вы запускаете bat-файл, открывается CMD-окно, Вы бесчинствуете, переопределяете переменные окружения, затем, после завершения сценария CMD-окно закрывается и все эти бесчинства отменяются. »

Это да :).


Цитата:

Цитата Nilf
в случае например с XP, »

Переходите на WSH ;).

megaloman 28-06-2021 19:01 2961074

Iska,
Цитата:

Цитата Iska
Переходите на WSH »

Резко возрастает трудоёмкость написания и надёжность работы - спотыкался.


Время: 20:44.

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