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

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

ivanxam 24-09-2013 13:31 2223093

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

Код:

set number=1
set ip=10.11.0.2
net use \\%ip% /delete 
net use \\%ip% password /user:user
for  %%i in (файл1 файл2 файл3) DO copy \\%ip%\folder\%%i g:\folder\%number%
set number=2
set ip=10.11.0.3
net use \\%ip% /delete 
net use \\%ip% password /user:user
for  %%i in (файл1 файл2 файл3) DO copy \\%ip%\folder\%%i g:\folder\%number%

батник я написал, но он состоит из таких строк для каждого компа.
Можно ли это сделать покомпактней? Сделать вложенный цикл пытался, но переменная с ip мешает, так как тоже меняется.
И если можно то попроще, это мой первый батник.

Iska 24-09-2013 13:49 2223102

Зачем подключения? Без домена живёте?
Код:

for %%i in (192.168.223.1 192.168.223.2 192.168.223.5 192.168.223.10) do (
    net use \\%%i password /user:user
    for  %%j in (файл1 файл2 файл3) do copy /y "\\%%i\folder\%%j" "g:\folder\%%i\"
    net use \\%%i /delete
)


ivanxam 24-09-2013 14:01 2223108

Спасибо, Iska, я думал так сделать, но это неудобно, потому что копирование файлов происходит в папку с названием ip а не с именем компа, с которого скачаны файлы. Я понимаю, что это уже мелочи, но тогда придется делать дубляж файлов и из папок с названием ip копировать файлы в соответствующие папки с названием компов. Может как то иначе можно?

А подключения нужны, чтоб автоматом вводились логин и пароль для доступа к скачиванию файлов. Если один раз ввести их он запомнит, но до перезагрузки компа. Потом надо вводить заново. Да и ошибки множественного подключения бывают.

А если первый цикл пустить по таким именам 192.168.223.1_comp1 192.168.223.2_comp2... затем перед net use разложить %%i на две переменные до и после "_" и использовать их? Может такое сработать? Если да, то как это реализовать?

ivanxam 24-09-2013 14:21 2223124

http://forum.oszone.net/thread-240191.html вот нашел, буду пробовать.

Iska 24-09-2013 14:41 2223132

ivanxam, если Вам известны имена — зачем ip?

ivanxam 24-09-2013 15:32 2223155

Это моя вина, дело в том, что имя компа, которое я имел ввиду это не hostname. hostname компьютеров я не знаю, знаю только ip. Скорее всего можно как-то узнать hostname по ip, но мне это было раньше незачем. Но все равно, даже если использовать hostname, он не совпадет с именами компов, которые мы используем. Вот в чем проблема.

Iska 24-09-2013 15:51 2223162

Объясните тогда отличие «имени компа» от «hostname». Объясните также, где Вы берёте имена машин и каким образом они связаны с ip (или у Вас вовсе статика)?

sunnykey 24-09-2013 16:40 2223192

Код:

#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension
$dest="g:\folder\"
function CopyFromDisk($ip,$cred) {
    New-PSDrive -Name P -Root "\\$ip\folder" -PSProvider FileSystem -Credential $cred
    Get-ChildItem p:\* -Recurse -Force | Copy-Item -Destination "$dest\$ip" -Recurse -Force
    Remove-PSDrive -Name P
}

$cred=Get-Credential
for ($i=2;$i -lt 255;$i++) {
    CopyFromDisk -ip "10.11.0.$i" -cred $cred
}


ivanxam 24-09-2013 17:16 2223204

sunnykey, я вообще ничего не понял)) так как только начал осваивать cmd/bat. Можешь объяснить, что тут вообще происходит?

Iska, объясняю, по всему городу стоят компьютеры, с которых мне нужно каждый день снимать электронные журналы. Компьютеров много, в разных подсетях, вплоть подключенные по GPRS, но их не касаемся. Я в мониторинге вижу "Имя компьютера" и IP каждого компьютера (hostname не знаю их). "Имя компьютера" это принятые нашим отделом названия машин.

Код:

@Echo Off

for  %%A in ("10.11.55.5#100001" "10.11.0.20#100003") do (
For /F "tokens=1,2 delims=#" %%B In ("%%A") Do Set Name=%%B&Set Gramm=%%C
Echo Name=%Name%
Echo Gramm=%Gramm%
)

Подскажите почему не разделяет %%А на 2 переменные? Делаю как тут http://forum.oszone.net/thread-240191.html

Foreigner 24-09-2013 17:33 2223213

ivanxam,
Цитата:

Подскажите почему не разделяет %%А на 2 переменные?
Код:

@Echo Off
setlocal enabledelayedexpansion

for  %%A in ("10.11.55.5#100001" "10.11.0.20#100003") do (

  For /F "tokens=1,2 delims=#" %%B In ("%%~A") Do Set "Name=%%B" & Set "Gramm=%%C"
  Echo Name=!Name!
  Echo Gramm=!Gramm!

)


ivanxam 24-09-2013 17:49 2223227

Foreigner, Спасибо!

Iska 25-09-2013 03:11 2223513

Цитата:

Цитата ivanxam
Iska, объясняю, …»

ivanxam, спасибо, ясно.

Цитата:

Цитата ivanxam
Компьютеров много, »

Предлагаю перейти к использованию текстового файла для наименований/адресов машин, вместо того, чтобы прямо писать их в пакетном файле.

Цитата:

Цитата ivanxam
Я в мониторинге вижу "Имя компьютера" и IP каждого компьютера (hostname не знаю их). »

Что представляет собой мониторинг?

ivanxam 01-10-2013 09:54 2226584

Iska, мониторинг - программа для слежения за работоспособностью компьютеров. Табличка с именами компов, айпи, и текущим состоянием.
Написал, вот что получилось:

Код:

@Echo Off
setlocal enabledelayedexpansion
set numstart=%1
set numstop=%2
for /F %%A in (namelist.txt) do (
  For /F "tokens=1-3 delims=#" %%B In ("%%~A") Do Set "number=%%B" & Set "ip=%%C" & Set "model=%%D"
  Echo ip=!ip!
  Echo number=!number!
  Echo model=!model!
if "!model!" == "h" net use \\!ip! /delete & net use \\!ip! 111 /user:111
if "!model!" == "h1" net use \\!ip! /delete &  net use \\!ip! 111 /user:111
if "!model!" == "h2" net use \\!ip! /delete &  net use \\!ip! 111 /user:111


if "!model!" == "w" for /L %%i in (%numstart%, 1, %numstop%) DO copy \\!ip!\customer\%%i.jrn g:\jurnal\!number!
if "!model!" == "h" for /L %%i in (%numstart%, 1, %numstop%) DO copy \\!ip!\journal\ej_!number!_%%i.dat g:\jurnal\!number!
if "!model!" == "h1" for /L %%i in (%numstart%, 1, %numstop%) DO copy \\!ip!\logs\journal\ej_!number!_%%i.dat g:\jurnal\!number!
if "!model!" == "h2" for /L %%i in (%numstart%, 1, %numstop%) DO copy \\!ip!\journal\ej_!number!_%%i.dat g:\jurnal\!number!
if "!model!" == "w1" for /L %%i in (%numstart%, 1, %numstop%) DO copy \\!ip!\journal\%%i.jrn g:\jurnal\!number!

)

Может кривовато и не оптимизировано но работает отлично))) Можно было бы обойтись меньшим количеством строк, но на разных машинах разный путь до журналов.

Файл Name list выглядит так

100001#10.11.55.155#w
100003#10.11.0.200#w
100004#10.11.1.254#w
100005#10.11.1.50#h

Iska 01-10-2013 12:43 2226672

Цитата:

Цитата ivanxam
но на разных машинах разный путь до журналов. »

Это тоже в:
Цитата:

Цитата ivanxam
Файл Name list »

должно быть.

luda-chel 23-05-2014 21:24 2354975

Здравствуйте Всем!!!! Подскажите как можно в бат файле прописать следующее:
1.Заходим на диск в сети.
2. Из множества папок выбрать нужную.
3. Записать к себе на диск.
(это мне необходимо для автоматизации установки программы. Но в зависимости от роли пользователя ему нужна для работы программы только 1 папка). Подробнее:
Чтобы во время выполнения бат файла выводилось на экран:
"Выберите нужную цифру".
И предлагалось список:
1 - ПапкаA
2 - ПапкаВ
3 - ПапкаС и т.д. список небольшой.
И я с экрана вводила цифру нужной мне папки. Например после вопроса ввожу цифру 2.
Тогда программа идет в "ПапкаВ" и оттуда берет файл и пишет его на диск пользователя.
Начало (если зайти удаленно на комп пользователя):
mkdir c:\АРМ - создаст на диске С папку АРМ
xcopy "c:\2" "c:\АРМ" /e/c/h/n/y/ где c:\2 - откуда берет и куда пишет: c:\АРМ
далее нужно зайти в сеть на сервер в указанную директорию и выбрать там папку нужную для пользователя, т.е. сделать то что я пыталась обяъснить выше.
Кто нибудь может помочь новичку!!!! ОЧЕНЬ ОЧЕНЬ нужна ПОМОЩЬ!!!


Время: 08:51.

Время: 08:51.
© OSzone.net 2001-