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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Помогите задать параметр exclude команды xcopy из переменной без промежуточного файла (http://forum.oszone.net/showthread.php?t=340153)

15551 18-04-2019 12:47 2868236

Помогите задать параметр exclude команды xcopy из переменной без промежуточного файла
 
Если это возможно, конечно же. (Система - Windows XP, задача - раскидывание папок по разным сетевым папкам в зависимости от названия)

Сильно упрощённо через промежуточный файл код выглядит так:

set list=(тут формирование условия для exclude)
echo %list% > c:\file.txt
xcopy c:\new \\server\vasya\new\ /e /h /k /q /exclude:c:\file.txt

С целью, так сказать, шлифовки кода желаю обойтись без промежуточного файла, но не знаю как задать /exclude прямо из переменной list. Пробовал оператор перенаправления /exclude:<%list% или <!list! - так он явно не работает, xcopy такого "файла" не видит.

Пробовал перенаправлением дескрипторов (<&n где n - цифра от 0 до 9) - вообще не понял как их правильно использовать, не говоря уж о том как их использовать для xcopy. Идея была - записать %list% в неиспользуемый дескриптор, затем перенаправить его:

echo %list% >&3
xcopy c:\new \\server\vasya\new\ /e /h /k /q /exclude:<&3

В этом случае как раз xcopy и не ругается, просто переписывает весь каталог ничего не исключая.
Откуда у меня и возникло предположение, что как-то сделать это можно, но как - не знаю, вот спрашиваю у сообщества.


(Про robocopy я слышал, но разбираться с ним, проверять надёжность/скорость, менять ключи, сообщать людям об необходимости наличия дополнительной утилиты - в общем КМК не стоит оно того, учитывая что xcopy выше - находится в отдельной ф-ии, вызываемой в батнике с разных мест с разными параметрами и ключами для того xcopy.)

megaloman 18-04-2019 18:57 2868293

Как Вам такое извращение? (в XP не проверял). Самому смешно, но работает! :) Переменная list не нужна. Проверено, если список будет задан с отступом, то он в исключения не попадет.
Код:

        @Echo Off
                xcopy Box_In\*.* Box_Out\ /s /EXCLUDE:%~dpnx0
        Exit /B
.js
.bat
\Муз\

Если батник длинный, то, скорее всего, этот плод воспалённого воображения будет работать медленно. Может быть, так будет оптимальнее...
Код:

        @Echo Off
        GoTo :Begin
.js
.bat
\Муз\
        :Begin
                xcopy Box_In\*.* Box_Out\ /s /EXCLUDE:%~dpnx0
        Exit /B

Цитата:

Цитата 15551
задача - раскидывание папок по разным сетевым папкам в зависимости от названия) »

Может, лучше поискать другой способ? (тогда надо более подробное изложение задачи)

15551 18-04-2019 20:03 2868306

Использовать в к-ве списка самого себя - идея!

Но у меня переменная %list% собирается "на ходу", в зависимости от внешних условий, там в "set list=(тут формирование условия для exclude)" это самое формирование условия состоит из кучи IF-ов, так что жёстко задать список не получается.

И другой способ - я не представляю себе как. Подробное изложение - раз за разом в отдельную папку местное ПО на работу которого я повлиять не могу выгружает до десятка папок, в них - где пара штук, где пара десятков файлов, и в самой корневой папке - тоже файлы, но уже несколько десятков. Эти папки/файлы в зависимости от имени батником раскидываются по разным операторам, в зависимости от того чей комп сейчас включён, кому какая информация свойственна да ещё и делится чтобы не было одному пусто, другому густо. (это всё в вышеупомянутых IF-ах определяется)

alpap 18-04-2019 23:21 2868325

15551,
можно загнать в исключение и без xcopy, например так:
Код:

@echo off
set "excl="*.js" "*.bat" "Муз*""

for /f "delims=" %%a in ('dir /b %excl%') do set "%%~nxa=Exclude"
for /f "delims=" %%a in ('dir /b') do if not defined %%~nxa echo %%~nxa
pause


megaloman 19-04-2019 14:49 2868378

ИМХО, лучше сделать код кратко и надёжно с созданием служебного файла, чем городить многострочный код.
Цитата:

Цитата alpap
можно загнать в исключение и без xcopy, например так: »

Красиво придумано, для меня открытие, что имя переменной в CMD может содержать пробелы. Интересно, есть ли ограничение на длину идентификатора? Но, тем не менее, xcopy хорош тем, что создаёт нужную структуру каталогов при копировании. Вот код, который имитирует /Exclude, в качестве развлечения:
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "BoxOut=Z:\Box_Out"

        Set "Ext@@001=.js"
        Set "Ext@@002=.bat"
        Set "Ext@@003=\Муз\"

        FOR /F "usebackq delims=" %%x IN (`xcopy /L /S /E /F /Y "%BoxIn%\*.*" "%BoxOut%\"`) DO (
                Set "S=%%~dpx"
                Call :ExtCopy "%%S: -> =" "%%"
        )
Exit /B

:ExtCopy
        If "%~2"=="" Exit /B 0
        Set "SS=%~1"
        Set "SSS=%SS%"
        FOR /F "usebackq tokens=2 delims==" %%e IN (`Set "Ext@@"`) DO Call Set "SSS=%%SSS:%%e=%%"

        If "%SS%"=="%SSS%" (
                >nul xcopy /Y %1 %2
        )
Exit /B


alpap 19-04-2019 15:55 2868386

Цитата:

Цитата megaloman
xcopy хорош »

я вообще тоже за него и с учетом
Цитата:

Цитата 15551
у меня переменная %list% собирается "на ходу", в зависимости от внешних условий »

как по мне так гораздо проще редактировать txt, особенно с учетом того что сам bat может лежать в кладовой для bat, а txt под рукой.


Время: 15:11.

Время: 15:11.
© OSzone.net 2001-