У меня есть несколько файлов, которые следуют такой схеме:

<BaseName> . <Version> [ - <Tag> - <#> ] . <Extension>

Например:

basename.1.0.0.ext
basename.1.0.0-aaa-1.ext
basename.1.0.0-aaa-2.ext
basename.1.0.0-aaa-3.ext
basename.1.0.0-bbb-1.ext
basename.1.0.0-bbb-2.ext
basename.1.0.0-bbb-3.ext

Теперь мне нужно написать строгий, который будет копировать только файл с определенной частью тега (или без тега) целевой папки. Например:

xcopy *-aaa-*.ext \\server\path /f /y

Будет копировать только файлы с тегом 'aaa'. Все идет нормально.

Проблема в том, что скрипт также должен работать с файлами без тегов, в основном мне нужно все, что соответствует *.ext кроме того, что соответствует *-*.ext Ext .

К сожалению, у меня есть ряд ограничений здесь:

  • Я не могу изменить шаблон имени или расположение этих файлов.
  • Часть 'version' неизвестна, поэтому *.1.0.0.ext не будет работать.
  • "Версия" не имеет фиксированной длины, поэтому *.?.?.?.ext не будет работать.
  • Параметр exclude xcopy не принимает шаблон, только список файлов, поэтому это не сработает.
  • Я застрял с использованием пакетных сценариев для этого. Вызов PowerShell не исключен, но для его работы потребуется немало накладных расходов, поэтому я хотел бы избежать этого, если это возможно.
  • Фактический сценарий должен выглядеть следующим образом:

    xcopy "%SOURCE%" "%DEST%" /f /y
    

    И переменные, используемые этим сценарием, будут сохранены во внешнем файле конфигурации.

Как я могу написать этот скрипт, чтобы он работал с любым набором файлов, как с определенным «тегом», так и без «тега»?

2 ответа2

1

foo.bat:

dir /b %3 > exclude_list.txt
xcopy %1 %2 /f /y /EXCLUDE:exclude_list.txt

Для исключений, как в вашем примере:

call foo.bat "C:\source\*.ext" "C:\destination\" "*-*.ext"

Без исключений (бездарный взлом "):

call foo.bat "C:\source\*.ext" "C:\destination\" "A_STRING_THAT_CANNOT_MATCH"

Смотрите также Robocopy switch /xf {filename}

0

Вот что я сейчас использую:

for /f "delims=" %%f in ('dir /b "*.ext" ^| findstr "%TAG%"') do (
    xcopy "%ff" %DEST% /f /y
)

Поэтому, чтобы скопировать данный тег, вам просто нужно указать TAG=-aaa- , и вы даже можете указать несколько тегов, разделенных пробелами, например, TAG=-aaa -bbb- .

Недостатком является то, что для развертывания файлов, у которых нет тега, вам нужно сделать что-то действительно ужасное, например, TAG=^[^-]*$ . Хотя я мог бы изменить его в будущем, чтобы он также использовал переменную для указания флага /v (которая инвертирует поведение findstr), но в данный момент это не кажется необходимым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .