Войти

Показать полную графическую версию : [решено] Путаница в ключах


Roman_Ko
11-03-2016, 14:14
Добрый день!
Имеется задача. Помогите с решением.
Дано: Список №1 = Выбранные компьютеры

pc-nb-01
pc-nb-02
pc-nb-03

Список №2 = Уникальные номера

1050
1100
1150

Задача: Создать на выбранных компьютерах каталоги с уникальными номерами.

Накатал батник:

@echo off
set ComputerList=listfile.txt
set ID=PiontID.txt
for /f "tokens=1" %%a in (%PointID%) do (
for /f %%i in (%ComputerList%) do start cmd /c "psexec.exe \\%%i cmd /c mkdir \\%%i\c$\Temp\%%a"
)

Результатом у меня получается, что на каждом компьютере создаются 3 директории
c:\Temp\1050
c:\Temp\1100
c:\Temp\1150
А должно быть по одной директории на каждом компьютере,т.е. на компьютере pc-nb-01 должен появиться каталог c:\Temp\1050, на pc-nb-02 - c:\Temp\1100 и на pc-nb-03 - c:\Temp\1150.

Как говориться "запутался в трёх соснах" :)
Помогите разобраться, какие ключи после for /f необходимо поставить, чтобы добиться желаемого результата.

alpap
11-03-2016, 18:45
@echo off
setlocal enabledelayedexpansion
set "ComputerList=listfile.txt"
set "ID=PointID.txt"
set n=0
for /f delims^=^ eol^= %%a in ('type "%ComputerList%"') do (
set /a n+=1
set m=0
for /f delims^=^ eol^= %%b in ('type "%ID%"') do (
set /a m+=1
if !n!==!m! echo %%a %%b (Напишите свою команду)
))
pause>nul

Roman_Ko
12-03-2016, 11:45
Спасибо за ответ!
Сейчас попробовал Ваш вариант, написав свою команду (start cmd /c "psexec.exe \\%%a cmd /c mkdir \\%%a\c$\Temp\%%b") :

@echo off
setlocal enabledelayedexpansion
set "ComputerList=listfile.txt"
set "ID=PointID.txt"
set n=0
for /f delims^=^ eol^= %%a in ('type "%ComputerList%"') do (
set /a n+=1
set m=0
for /f delims^=^ eol^= %%b in ('type "%ID%"') do (
set /a m+=1
if !n!==!m! echo %%a %%b start cmd /c "psexec.exe \\%%a cmd /c mkdir \\%%a\c$\Temp\%%b"
))
pause>nul


Результатом получаю

pc-nb-01 1050 start cmd /c "psexec.exe \\pc-nb-01 cmd /c mkdir \\pc-nb-01\c$\Temp\1050"
pc-nb-02 1100 start cmd /c "psexec.exe \\pc-nb-02 cmd /c mkdir \\pc-nb-02\c$\Temp\1100"
pc-nb-03 1150 start cmd /c "psexec.exe \\pc-nb-03 cmd /c mkdir \\pc-nb-03\c$\Temp\1150"

Пишет нажмите кнопку для продолжения, все закрывается, папки не создаются.

Попробовал свою команду выполнить с новой строки:

@echo off
setlocal enabledelayedexpansion
set "ComputerList=listfile.txt"
set "ID=PointID.txt"
set n=0
for /f delims^=^ eol^= %%a in ('type "%ComputerList%"') do (
set /a n+=1
set m=0
for /f delims^=^ eol^= %%b in ('type "%ID%"') do (
set /a m+=1
if !n!==!m! echo %%a %%b
start cmd /c "psexec.exe \\%%a cmd /c mkdir \\%%a\c$\Temp\%%b"
))
pause>nul


Результатом получается, что на каждом компьютере создаются 3 директории, т.е. вернулся к тому, с чего начал...
c:\Temp\1050
c:\Temp\1100
c:\Temp\1150

Georgio
12-03-2016, 13:04
@echo off

set "ComputerList=listfile.txt"
set "ID=PointID.txt"

set n=-1
for /f "usebackq delims=" %%i in ("%ID%") do (
set /a n+=1
cmd /v /c for /f %%j in ('more +!n! "%ComputerList%"'^) do^
@start cmd /c "psexec.exe \\%%j cmd /c mkdir "\\%%j\c$\Temp\%%i""^&^
exit /b
)

exit /b

Roman_Ko
12-03-2016, 15:06
Большое спасибо за быстрые ответы.
Вариант, предложенный Georgio, отработал так как надо:
На компьютере pc-nb-01 появился каталог c:\Temp\1050
На компьютере pc-nb-02 появился каталог c:\Temp\1100
На компьютере pc-nb-03 появился каталог c:\Temp\1150
Больше никаких лишних папок в каталоге c:\Temp\ ни на одном компьютере не появилось.
Ещё раз спасибо!

Iska
12-03-2016, 15:08
Roman_Ko, для чего тут нужен «start cmd /c "…»?! Дабы не ждать?

Roman_Ko
12-03-2016, 22:49
Roman_Ko, для чего тут нужен «start cmd /c "…»?! Дабы не ждать? »
Допустим, вместо mkdir будет например copy размером от 1 Gb....
Ответ на Ваш вопрос - да, дабы не ждать. Спасибо.

Iska
12-03-2016, 23:24
Roman_Ko, вот токмо у Вас там не «mkdir», а «psexec.exe».

Roman_Ko
13-03-2016, 10:38
psexec.exe для удаленного выполнения mkdir...Я наверное несовсем понял о чем Вы хотели спросить. Можно без psexec?

Iska
13-03-2016, 16:18
Можно без psexec? »
Нет. Я просто думаю, зачем «start cmd /c» перед «psexec.exe». В последнем ведь есть:
-d Don't wait for process to terminate (non-interactive).

Roman_Ko
14-03-2016, 17:58
Без start cmd /c перед psexec - не сработает.

Iska
14-03-2016, 18:49
Без start cmd /c перед psexec - не сработает. »
Отчего? Или — не сработает что?

Roman_Ko
14-03-2016, 21:56
Вы вот такой вариант имели ввиду?

@echo off

set "ComputerList=listfile.txt"
set "ID=PointID.txt"

set n=-1
for /f "usebackq delims=" %%i in ("%ID%") do (
set /a n+=1
cmd /v /c for /f %%j in ('more +!n! "%ComputerList%"'^) do^
psexec.exe \\%%j -d cmd /c mkdir "\\%%j\c$\Temp\%%i"^&^
exit /b
)
exit /b

Так тоже работает, и даже быстрее.




© OSzone.net 2001-2012