Использование копирования для копирования определенных файлов (на основе имен файлов) из нескольких каталогов в один каталог, удаления метки времени и сохранения имени файла и расширения - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь скопировать определенные файлы (поиск всегда основан на именах файлов) из 2 подкаталогов (архив и архив), расположенных в 1 каталоге (источник), и скопировать их в другой каталог (SaveHere), сохранив имя файла ирасширение, но с удалением отметки времени.

Попробовал приведенный ниже скрипт, но он не работал:

copy U:\clients\source\archive\ + U:\clients\source\archivestore\SampleFileName.file__01-02-2019_22-35-11-444_A X:\SaveHere\*.file
copy U:\clients\source\archive\ + U:\clients\source\archivestore\SampleFileName2.file_19-04-2019_20-35-56-676_A X:\SaveHere\*.file
pause

Я ожидаю, что скрипты проверят оба подкаталога (архив и архивное хранилище) на наличие указанных имен файлов(SampleFileName.file_01-02-2019_22-35-11-444_A и SampleFileName2.file_19-04-2019_20-35-56-676_A) и везде, где найдены файлы, для копирования в целевой каталог (X:\SaveHere\) с датой-stamp (_01-02-2019_22-35-11-444_A и _19-04-2019_20-35-56-676_A) удалены, и остается только имя файла с расширением (SampleFileName.file и SampleFileName2.file)

1 Ответ

0 голосов
/ 21 апреля 2019

Вопрос не очень понятен.Итак, я начну с примера:

Каталог U:\clients\source содержит каталоги и файлы:

  • архив
    • SampleFileName.file__01-02-2019_22-35-11-444_A
    • SampleFileName2.file_19-04-2019_20-35-56-676_A
  • архив
    • SampleFileName2.file_19-04-2019_20-35-56-676_A

Каталог X:\SaveHere должен содержать после выполнения пакетного файла:

  • SampleFileName.file
  • SampleFileName2.file ... предпочтительнее из каталога archive.

One из множества возможных решений для этой задачи копирования файлов использует циклы:

@echo off
for %%I in ("SampleFileName.file" "SampleFileName2.file") do (
    for %%J in ("U:\clients\source\archivestore" "U:\clients\source\archive") do (
        for %%K in ("%%~J\%%~I_*") do copy /Y "%%K" "X:\SaveHere\%%~I" >nul
    )
)

Самый внешний FOR выполняется два раза в секунду FOR с первым "SampleFileName.file" и секунда "SampleFileName2.file" присвоены переменной цикла I.

Вторая FOR запускает два раза третий FOR с первым "U:\clients\source\archivestore" и вторым "U:\clients\source\archive" назначено для цикла variable J.

Итак, третий FOR выполняется в общей сложности четыре раза с шаблонами подстановочных знаков:

  1. "U:\clients\source\archivestore\SampleFileName.file_*"
  2. "U:\clients\source\archive\SampleFileName.file_*"
  3. "U:\clients\source\archivestore\SampleFileName2.file_*"
  4. "U:\clients\source\archive\SampleFileName2.file_*"

Третий FOR ищет не скрытые файлы, соответствующие текущему шаблону подстановочного знакаи запускает команду COPY для каждого найденного файла.

Команда COPY копирует файл, найденный третьей FOR , в каталог X:\SaveHere с целевым файломимя, определенное первым FOR , назначенным в настоящее время его переменной цикла I с перезаписью возможно уже существующего файла с таким же именем в X:\SaveHere.

Еще один решение использует только два FOR :

@echo off
for /R "U:\clients\source\" %%I in ("SampleFileName*.file_*") do (
    for /F "eol=| delims=_" %%J in ("%%~nxI") do copy /Y "%%I" "X:\SaveHere\%%J" >nul
)

Первый FOR ищет рекурсив в каталоге U:\clients\source и во всех его подкаталогах для файлов, соответствующих шаблону SampleFileName*.file_*и присваивает найденное имя файла с полным путем переменной цикла I перед выполнением второго FOR .

Второй FOR обрабатывает как строку только имя файла с расширением файла без пути.Он разделяется на строку с именем файла на подстроки, используя подчеркивание в качестве разделителя строк.Только первая строка, разделенная символом подчеркивания, присваивается переменной цикла J, например, один раз SampleFileName.file и дважды SampleFileName2.file.Затем второй FOR запускает команду COPY , чтобы скопировать файл с автоматически усеченным именем конечного файла на основе первого подчеркивания в имени исходного файла.

Это решение не работает, еслив имени файла есть знак подчеркивания, оставленный до даты / времени.

Недостатком этого решения является то, что порядок файлов, найденных более одного раза в дереве каталогов U:\clients\source, не определяется кодом пакетного файла,но файловой системой, которая возвращает имена файлов, соответствующие шаблону первого цикла FOR .

Прочитайте статью Microsoft о Использование операторов перенаправления команд для объяснения >nul.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

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