Пакетный скрипт для копирования файлов с длинными расширениями файлов - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть скрипт, который (robo) копирует файлы из разных папок, но этот пакетный скрипт копирует ВСЕ файлы для каждой из папок. Пожалуйста, смотрите ниже пакетный скрипт.

У меня есть файлы в исходных папках, формат которых .xxx.xxxxxxxxxx и .xxx.

Например, в folder A у меня есть 3 файла:

12345678901234.001.0423201154
23456789012345.005.0423201155
43210987654321.001

Я хочу скопировать только первые 2 файла в folder B и не включать последний файл.

Пожалуйста, помогите. Спасибо!

@echo off

set Source=\\TestSource
set Target=\\TestTarget
set FolderList=C:\temp\tstsource.txt
set LogFolder=C:\temp\Logfolder\

if not exist "%Source%" echo Source folder "%Source%" not found & goto Exit
if not exist "%FolderList%" echo File list "%FolderList%" not found & goto Exit
if not exist "%Target%" md "%Target%"

for /F "delims=" %%a in ('type "%FolderList%"') do (
     @echo Copying %%a folders and files, please wait ... 
     @echo "%Source%\%%a" "%Target%\%%a" /MOV /DCOPY:DAT /MIR /E /MT:16 /R:2 /W:30 /LOG:"%LogFolder%%%a.log"
     robocopy "%Source%\%%a" "%Target%\%%a" /MOV /DCOPY:DAT /E /MT:16 /R:2 /W:30 /LOG:"%LogFolder%%%a.log"
     @echo.
     @echo *..........................................................
)

:Exit
echo.
echo press the Space Bar to close this window.
pause > nul

1 Ответ

0 голосов
/ 25 апреля 2020

Попробуйте использовать канал к findStr в команде for, чтобы исключить любые нежелательные шаблоны файлов из файла FolderList при type его загрузке.

Пример:

for /F "delims=" %%a in ('type "%FolderList%" ^| findStr /I /V /R /C:"^[01234567890]*\.[0123456789][0123456789][0123456789]$"') do (
   ...
)

Вы можете выполнить findStr /? в командном окне cmd.exe, чтобы прочитать документацию о синтаксисе и регулярных выражениях.

По существу /I для «игнорирования регистра», /V для «исключения / пропуска совпадений» и /R означает «использование анализа регулярного выражения».
Символ канала должен быть экранирован внутри оператора for, для которого используется курсор (^|).

Этот RegEx должен соответствовать нежелательным шаблонам файлов:
"^[01234567890]*\.[0123456789][0123456789][0123456789]$"

При этом я предположил, что ваши имена файлов состоит только из цифр, которые можно обозначить как класс символов в скобках [0123456789]*, а звездочка означает «допускается повторение от нуля или более раз».
Точка должна быть экранирована \., поскольку в регулярном выражении точка расшифровывается как «любой отдельный символ» (.*, следовательно, является «последовательностью любого количества символов, от нуля или более»).
Группа из трех классов после точки означает «три вхождения цифр 0-9», соответствовать расширению файла. Символ каретки ^ в начале RegEx означает «от начала строки», а доллар $ обозначает «конец строки» (то есть пробелы после последнего di git не допускаются для пример).

Можно немного сократить RegEx, используя [0-9] или [a-z] для строчных букв и [A-Z] соответственно, вместо явного перечисления разрешенных символов / цифр в классе. Это может быть трудно отследить побочные эффекты, поэтому обычно я всегда перечисляю все разрешенные символы в явном виде.

Редактировать: Я пропустил ту часть, что вы хотите скопировать только первые два шаблона файла. В этом случае вы можете опустить /V и искать файлы с 2 точками, например: "[01234567890]*\.[0123456789]*\.[0123456789]*", который принимает любое количество цифр, разделенных двумя точками.

Ваш подход к сопоставлению по длине имени файла + расширение должно работать одинаково хорошо. Если вы хотите, чтобы минимальное или фиксированное количество символов было разрешено, используйте точку в качестве заполнителя ровно для одного символа (di git или символ). (Как видно из комментариев ниже)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...