Войти

Показать полную графическую версию : [решено] вложенный цикл for с условием if


ivanxam
24-09-2013, 13:31
Добрый день, вопрос вот в чем.
Делаю батник, который заходит по очереди на каждый комп и скачивает с каждого компа файлы.
При этом переподключает подключение (против множественного подключения)
написал так


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
Зачем подключения? Без домена живёте?
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
Спасибо, Iska, я думал так сделать, но это неудобно, потому что копирование файлов происходит в папку с названием ip а не с именем компа, с которого скачаны файлы. Я понимаю, что это уже мелочи, но тогда придется делать дубляж файлов и из папок с названием ip копировать файлы в соответствующие папки с названием компов. Может как то иначе можно?

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

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

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

Iska
24-09-2013, 14:41
ivanxam, если Вам известны имена — зачем ip?

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

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

sunnykey
24-09-2013, 16:40
#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
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 (http://forum.oszone.net/thread-240191.html)

Foreigner
24-09-2013, 17:33
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
Foreigner, Спасибо!

Iska
25-09-2013, 03:11
Iska, объясняю, …»
ivanxam, спасибо, ясно.

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

Я в мониторинге вижу "Имя компьютера" и IP каждого компьютера (hostname не знаю их). »
Что представляет собой мониторинг?

ivanxam
01-10-2013, 09:54
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
но на разных машинах разный путь до журналов. »
Это тоже в:
Файл Name list »
должно быть.

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




© OSzone.net 2001-2012