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

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

55kadi 27-10-2016 01:08 2681979

копирование BAT
 
на диске C: есть папка C:\LOGO\555
в папке 555 есть 3 файла
1.cfg
2.so
3.BIN
как скопировать эти 3 файла в другую папку и под папки в ней с заменой этих файлов если существуют C:\LOGO\new\launch\968000000000

55kadi 27-10-2016 01:24 2681981

да это папка 968000000000

в ней 100 разных папок в эти папки мне и надо скопировать эти 3 файла если они там есть то с заменой

megaloman 27-10-2016 10:49 2682042

Код:

@Echo Off

Set  "InBox=C:\LOGO\555"
Set "OutBox=C:\LOGO\new\launch\968000000000"

Pushd %InBox%

Xcopy "1.cfg" "%OutBox%\" /Y /D /R /H /C /K >nul
Xcopy "2.so" "%OutBox%\" /Y /D /R /H /C /K >nul
Xcopy "3.bin" "%OutBox%\" /Y /D /R /H /C /K >nul

FOR /F "usebackq delims=" %%d IN (`Dir /B /A:D 2^>nul`) DO (
        Xcopy "%%d" "%OutBox%\%%d\" /Y /D /E /R /H /C /K >nul
)
popd
GoTo :Eof

Обратите внимание на ключ /D в команде Xcopy: копируются только те файлы, которые новее в исходной папке. Это существенно ускорит процесс. Если Вам каждый раз хочется копировать с перезаписью абсолютно всё - этот ключ уберите.

55kadi 27-10-2016 19:49 2682204

пишет неправильно указан диск в чем проблема

55kadi 28-10-2016 01:11 2682276

работает разобрался изменил букву названия диска С: с большой на маленькую с:

но осталась одна проблема эти 3 файла он копирует в папку 968000000000

а мне надо скопировать эти 3 файла с заменой в папки их порядка 100 штук которые находяться в папке 968000000000

@Echo Off

Set "InBox=с:\LOGO\555"
Set "OutBox=с:\LOGO\new\launch\968000000000"

Pushd %InBox%

Xcopy "1.cfg" "%OutBox%\" /Y /D /R /H /C /K >nul
Xcopy "2.so" "%OutBox%\" /Y /D /R /H /C /K >nul
Xcopy "3.bin" "%OutBox%\" /Y /D /R /H /C /K >nul

FOR /F "usebackq delims=" %%d IN (`Dir /B /A:D 2^>nul`) DO (
Xcopy "%%d" "%OutBox%\%%d\" /Y /D /E /R /H /C /K >nul
)
popd
GoTo :Eof

megaloman 28-10-2016 05:10 2682287

55kadi, я, похоже, неверно понял задачу. Мой скрипт из папки 555 берёт 3 файла и все подпапки в ней и копирует в папку 968000. А что нужно Вам? Взять из папки 555 три файла и скопировать их во все подпапки папки 968000? А если в этих папках есть тоже подпапки более глубокого уровня, то и туда копировать тоже?
О букве "c" в имени диска- неважно, большая она или маленькая, главное, чтобы она была латинская а не русская, вполне возможно, что это я виноват- у меня при отладке была другая буква диска, не C.

55kadi 28-10-2016 05:36 2682288

Взять из папки 555 три файла и скопировать их во все подпапки папки 968000

megaloman 28-10-2016 06:21 2682292

Взять из папки 555 три файла и скопировать их во все подпапки папки 968000
Код:

@Echo Off

Set  "InBox=C:\LOGO\555"
Set "InFile="1.cfg" "2.so" "3.bin""

Set "OutBox=C:\LOGO\new\launch\968000000000"

FOR /F "usebackq delims=" %%d IN (`Dir "%OutBox%" /B /A:D 2^>nul`) DO (
        FOR %%f IN (%InFile%) DO (
                Copy "%InBox%\%%~f" "%OutBox%\%%d\" >nul
        )
)

Взять из папки 555 три файла и скопировать их во все подпапки папки 968000, если они более свежие
Код:

@Echo Off

Set  "InBox=C:\LOGO\555"
Set "InFile="1.cfg" "2.so" "3.bin""

Set "OutBox=C:\LOGO\new\launch\968000000000"

FOR /F "usebackq delims=" %%d IN (`Dir "%OutBox%" /B /A:D 2^>nul`) DO (
        FOR %%f IN (%InFile%) DO (
                Xcopy "%InBox%\%%~f" "%OutBox%\%%d\" /Y /D >nul
        )
)

Должен заметить, что если файлы 1,2,3 заняты, то занятый файл скопирован и перезаписан не будет.

55kadi 28-10-2016 17:14 2682533

Вложений: 1
не работает

megaloman 28-10-2016 18:41 2682556

Цитата:

Цитата 55kadi, не верю
не работает

Вот отладочный вариант, в папке C:\LOGO\555 образуется LOG-файл с именем батника, не сочтите за труд довести его содержимое до меня
Код:

@Echo Off

Set  "InBox=C:\LOGO\555"
Set "InFile="1.cfg" "2.so" "3.bin""

Set "OutBox=C:\LOGO\new\launch\968000000000"

Dir "%OutBox%" /A:D  >"%InBox%\%~nx0.LOG"
Dir "%InBox%\?.*" /A:-D >>"%InBox%\%~nx0.LOG"

FOR /F "usebackq delims=" %%d IN (`Dir "%OutBox%" /B /A:D 2^>nul`) DO (
        Echo ----- "%OutBox%\%%d\" >>"%InBox%\%~nx0.LOG"
        FOR %%f IN (%InFile%) DO (
                Echo Copy "%InBox%\%%~f" "%OutBox%\%%d\" >>"%InBox%\%~nx0.LOG"
                Copy "%InBox%\%%~f" "%OutBox%\%%d\" >nul
        )
)

Кстати, а файлы реально называются ="1.cfg" "2.so" "3.bin" или у них иные имена? Если иные, надо честно их указать
Из вашего скриншота следует, что:
или нет подпапок в папке C:\LOGO\new\launch\968000000000
или нет файлов "1.cfg" "2.so" "3.bin" в папке C:\LOGO\555

55kadi 28-10-2016 22:22 2682610

Вложений: 1
LOG-файл не создаеться

alpap 28-10-2016 22:44 2682618

megaloman,
надо поправить
Цитата:

Цитата megaloman
"%InBox%\%~0.LOG" »


megaloman 28-10-2016 23:36 2682623

Вложений: 1
alpap, Копирую к себе скрипт, запускаю, работает. Я не вижу, что надо поправлять. Попробуйте - получится! Мой лог предоставляю.

alpap 29-10-2016 00:08 2682625

Цитата:

Цитата megaloman
Я не вижу, что надо поправлять »

вот это: Файл 140826
вероятно ТС тоже запускает извне.

megaloman 29-10-2016 00:25 2682628

alpap, Спасибо. Запомню. Странно, что по разному отрабатывает %~0 для запуска из Far и с рабочего стола.
55kadi, Итак, в отладочном варианте вместо %~0 надо писать %~nx0
В отладочном варианте скрипта поправил. Проделайте, пожалуйста.

Iska 29-10-2016 00:41 2682631

Цитата:

Цитата megaloman
Странно, что по разному отрабатывает %~0 для запуска из Far и с рабочего стола. »

В смысле?

megaloman 29-10-2016 00:58 2682633

Iska, При запуске батника из папки из фара %~0 выдаёт имя.расширение, а с рабочего стола или из проводника Путь\имя.расширение

55kadi 29-10-2016 01:49 2682640

Вложений: 1
log

Iska 29-10-2016 02:04 2682641

Цитата:

Цитата megaloman
Iska, При запуске батника из папки из фара %~0 выдаёт имя.расширение, а с рабочего стола или из проводника Путь\имя.расширение »

Да ну?!
Скрытый текст

megaloman 29-10-2016 08:36 2682657

Вложений: 1
Iska, У меня, конечно, FAR старый ...
Если в командном окне перейти в папку, где хранится батник, то %~0 тоже выдаст имя.расширение без пути

Iska 29-10-2016 09:02 2682659

Цитата:

Цитата megaloman
Iska, У меня, конечно, FAR старый ... »

Какой (с точностью до полной версии)? Я ни в одном с таким не сталкивался.

megaloman 29-10-2016 09:11 2682660

Вложений: 1
Iska, Вот скриншот

megaloman 29-10-2016 09:44 2682669

Iska, Скачал Far30b4774.x86.20160902, действительно там %~0 выдаёт путь\имя.расширение, не так, как если бы батник выполнялся в командном окне. Я привык к тому, что из под фара и в командном окне батники работают одинаково. Отвыкать? :cry:

Iska 29-10-2016 10:00 2682673

Цитата:

Цитата megaloman
Iska, Вот скриншот »

Да, действительно старый, скоро пятнадцать лет версии будет.

Под имеющейся 1.70 beta 5 всегда показывает полный путь. Под чуть более ранним 1.70 beta 4 — полный, либо короткий, зависит от того, вызываем мы его просто по имени (например, Enter на имени пакетного файла), или с полным путём (например, Ctrl-F, Enter). Кстати, аналогичное поведение будет и при вызове пакетного файла из-под обычной командной строки.

Полагаю, где-то в промежутке между beta 4 и beta 5 перекроили Executor, и он стал всегда пытаться использовать полный путь. Слева — beta 4, справа — beta 5:
Скрытый текст

Деталей в changelog не нашёл.


Цитата:

Цитата megaloman
не так, как если бы батник выполнялся в командном окне. »

Нет-нет. В командной строке будет всё ровно так же — в зависимости от того, указан было просто имя, или же полный путь:
Скрытый текст

А вот с beta 5 поведение Far Manager'а при запуске стало отличаться от командной строки.

Iska 29-10-2016 10:16 2682682

Цитата:

Цитата megaloman
Я привык к тому, что из под фара и в командном окне батники работают одинаково. Отвыкать? »

В Вашей версии (beta 4) они как раз-таки и работают одинаково. А с beta 5 поведение привели в соответствие с Проводником — использовать ассоциацию, как следствие — полный путь.

55kadi 29-10-2016 15:10 2682754

Цитата:

Цитата megaloman
Папка C:\LOGO\new\launch\968000000000 не существует. Сверьте имя реальной папки и имя, прописанное в батнике. »

ДА работает была ошибка в имени папки

СПАСИБО

а можно усложнить задание

в папке 968000000000 есть подпапки например 1111 2222 3333 4444 5555 в некоторых подпапках есть свои подпапки 0000 1234......

можно сделать так стоб эти 3 фаила копировались в подпапки 1111 2222 5555 ..........а если в подпапках есть свои подпапки то только в подпапки подпапок 0000 1234 5432 .....................

968000000000\
1111
2222
3333\ 0000
1234
5555
4444\0000
5432

заранее спасибо

megaloman 29-10-2016 17:44 2682783

55kadi,
а можно усложнить задание
Код:

@Echo Off

Set  "InBox=C:\LOGO\555"
Set "InFile="1.cfg" "2.so" "3.bin""

Set  "OutBox=C:\LOGO\new\launch\968000000000"
Set "OutBox2=0000"

Set "Log=0"
Set "Lfile=%InBox%\%~nx0.LOG"

If %Log%==1 Dir "%OutBox%" /A:D  >"%Lfile%"
If %Log%==1 Dir "%InBox%\?.*" /A:-D >>"%Lfile%"

FOR /F "usebackq delims=" %%d IN (`Dir "%OutBox%" /B /A:D 2^>nul`) DO (
        If %Log%==1 Echo ----- "%OutBox%\%%d\" >>"%Lfile%"
        FOR %%f IN (%InFile%) DO (
                If %Log%==1 Echo Copy "%InBox%\%%~f" "%OutBox%\%%d\" >>"%Lfile%"
                Copy "%InBox%\%%~f" "%OutBox%\%%d\" >nul
                If Exist "%OutBox%\%%d\%OutBox2%\" (
                        If %Log%==1 Echo Copy "%InBox%\%%~f" "%OutBox%\%%d\%OutBox2%\" >>"%Lfile%"
                        Copy "%InBox%\%%~f" "%OutBox%\%%d\%OutBox2%\" >nul
                )
        )
)


55kadi 29-10-2016 18:31 2682795

Цитата:

Цитата megaloman
а можно усложнить задание »

мы не поняли друг друга

в папке 968000000000\есть подпапки 100 штук с разными именами например 123\ 454\.......в некоторых подпапках 123\454.... ест свои подпапки например 006\001......

и мне надо стоб эти 3 фаила копировались в подпапки 123\454......если в них нет подпапок а если в них есть еще подпапки 006\001 то вних

имена подпапок сейчас как пример реально другие названия

55kadi 29-10-2016 19:28 2682811

Вложений: 1
C:\LOGO\new\launch\968000000000\
1****\
2****\
3****\
4** \5****\
7****\
5****\
............
1***,2****...... это папки и этих папок около 100 штук

и эти 3 фаила надо копироват с заменой в эти папки

а если в этих папках есть подпапки то в них 5****,7****

55kadi 29-10-2016 19:54 2682823

Вложений: 1
на прикрепленом фаиле стрелками я показал куда копировать

только имена папок их около 100 у меня другие 5**********,4**** ........... ето пример

megaloman 29-10-2016 22:01 2682863

55kadi, Вы нарисовали пример дерева папок и указали, в какие папки надо копировать, а в какие нет.
Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set  "InBox=C:\LOGO\555"
Set "InFile="1.cfg" "2.so" "3.bin""

Set  "OutBox=C:\LOGO\new\launch\968000000000"

FOR /F "usebackq delims=" %%d IN (`Dir "%OutBox%" /B /A:D 2^>nul`) DO (
        Set "LDir=0"
        FOR /F "usebackq delims=" %%p IN (`Dir "%OutBox%\%%d\" /B /A:D 2^>nul`) DO (
                Set "LDir=1"
                Call :Proc "%OutBox%\%%d\%%p\"
        )
        If !LDir!==0 Call :Proc "%OutBox%\%%d\"
)
GoTo :Eof

:Proc
        FOR %%f IN (%InFile%) DO (
                Copy "%InBox%\%%~f" %1 >nul
        )
GoTo :Eof


55kadi 29-10-2016 22:55 2682882

спасибо работает


Время: 03:09.

Время: 03:09.
© OSzone.net 2001-