Войти

Показать полную графическую версию : Помогите задать параметр exclude команды xcopy из переменной без промежуточного файла


15551
18-04-2019, 12:47
Если это возможно, конечно же. (Система - 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
Как Вам такое извращение? (в 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
18-04-2019, 20:03
Использовать в к-ве списка самого себя - идея!

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

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

alpap
18-04-2019, 23:21
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
ИМХО, лучше сделать код кратко и надёжно с созданием служебного файла, чем городить многострочный код. можно загнать в исключение и без 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
xcopy хорош »
я вообще тоже за него и с учетом
у меня переменная %list% собирается "на ходу", в зависимости от внешних условий »
как по мне так гораздо проще редактировать txt, особенно с учетом того что сам bat может лежать в кладовой для bat, а txt под рукой.




© OSzone.net 2001-2012