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

Roman_Ko 11-03-2016 14:14 2614940

Путаница в ключах
 
Добрый день!
Имеется задача. Помогите с решением.
Дано: Список №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 2615028

Код:

@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 2615165

Спасибо за ответ!
Сейчас попробовал Ваш вариант, написав свою команду (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 2615181

Код:

@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 2615229

Большое спасибо за быстрые ответы.
Вариант, предложенный 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 2615231

Roman_Ko, для чего тут нужен «start cmd /c "…»?! Дабы не ждать?

Roman_Ko 12-03-2016 22:49 2615359

Цитата:

Цитата Iska
Roman_Ko, для чего тут нужен «start cmd /c "…»?! Дабы не ждать? »

Допустим, вместо mkdir будет например copy размером от 1 Gb....
Ответ на Ваш вопрос - да, дабы не ждать. Спасибо.

Iska 12-03-2016 23:24 2615368

Roman_Ko, вот токмо у Вас там не «mkdir», а «psexec.exe».

Roman_Ko 13-03-2016 10:38 2615437

psexec.exe для удаленного выполнения mkdir...Я наверное несовсем понял о чем Вы хотели спросить. Можно без psexec?

Iska 13-03-2016 16:18 2615540

Цитата:

Цитата Roman_Ko
Можно без psexec? »

Нет. Я просто думаю, зачем «start cmd /c» перед «psexec.exe». В последнем ведь есть:
Цитата:

-d Don't wait for process to terminate (non-interactive).

Roman_Ko 14-03-2016 17:58 2615954

Без start cmd /c перед psexec - не сработает.

Iska 14-03-2016 18:49 2615968

Цитата:

Цитата Roman_Ko
Без start cmd /c перед psexec - не сработает. »

Отчего? Или — не сработает что?

Roman_Ko 14-03-2016 21:56 2616041

Вы вот такой вариант имели ввиду?
Код:

@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

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


Время: 12:47.

Время: 12:47.
© OSzone.net 2001-