3

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

D:\Folder_Source  
D:\Folder_Source\file1.txt  
D:\Folder_Source\FolderA  
D:\Folder_Source\FolderA\file1.txt  
D:\Folder_Source\FolderA\file2.txt  
D:\Folder_Source\FolderB  
D:\Folder_Source\FolderB\file3.txt  
D:\Folder_Source\FolderB\file4.txt  
D:\Folder_Source\FolderB\file8.txt

Я хочу переместить некоторые txt файлы в каждой подпапке в C:\Destination\ из командной строки.

Например, я хочу переместить файлы file1.txt , file2.txt , file8.txt и т.д.

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

Я попытался это, что не удается и не дает мне ожидаемого результата:

move /s file1.txt file2.txt file8.txt C:\Destination

Возможно ли что-то подобное даже из командной строки или пакетного скрипта?

1 ответ1

2

Вы можете использовать пакетный скрипт и установить в нем три переменные, одна из которых является путем к корневому исходному каталогу, который будет проходить для определенных файлов, вторая - путь назначения, куда будут скопированы новые файлы, а третья - файл. список имен файлов, которые вы хотите скопировать в каталог назначения.

С этими тремя переменными вы можете использовать цикл FOR /R для обхода исходного местоположения и использовать условную логику IF чтобы проверить, существуют ли уже файлы для какой-либо операции копирования или удаления, которую необходимо выполнить с каждым файлом. Кроме того, вы можете использовать CALL и подстановки переменных для передачи частей имени файла в другую подпрограмму и использовать дополнительную логику IF вместе с SET /A для увеличения числа повторяющихся файлов и т.д.


Пакетный скрипт

@ECHO OFF

SET "source=C:\Folder_Source"
SET "dest=C:\Destination"
SET "FileList=file1.txt file2.txt file8.txt" 

SET "dupCnt=1"

FOR /R "%source%" %%A IN (%FileList%) DO (
    IF NOT EXIST "%dest%\%%~NXA" (
        XCOPY /F /Y "%%~FA" "%dest%\" && IF EXIST "%%~FA" DEL /Q /F "%%~FA"
    ) ELSE (
        CALL :DupeRoutine "%%~FA" "%%~NA" "%%~XA"
        )
    )
GOTO :EOF

:DupeRoutine
IF EXIST "%dest%\%~2_(%dupCnt%)%~3" (
    SET /A dupCnt=%dupCnt%+1
    CALL :DupeRoutine "%~1" "%~2" "%~3"
) ELSE (
    IF NOT EXIST "%dest%\%~2_(%dupCnt%)%~3" ECHO F | XCOPY /Y /F "%~1" "%dest%\%~2_(%dupCnt%)%~3" && DEL /Q /F "%~1"
    SET "dupCnt=1" 
    )
GOTO :EOF

Результаты

Примечание. Если вы хотите, чтобы дублирующиеся имена файлов использовали другое соглашение об именах, отличное от _(#) я использовал, вам нужно изменить _(%dupCnt%) в сценарии в пределах "%dest%\%~2_(%dupCnt%)%~3" для любого другого формата, который вы хотите использовать, но %dupCnt% - это число, которое будет увеличиваться. Я тоже рад помочь в этом.

Источник до

D:\Folder_Source
│   file1.txt
│   file2.txt
│   file4.txt
│   file8.txt
│   file99.txt
│
├───FolderA
│       file1.txt
│       file2.txt
│       file4.txt
│       file8.txt
│       file99.txt
│
└───FolderB
        file1.txt
        file2.txt
        file4.txt
        file8.txt
        file99.txt

Направление после

C:\Destination
    file1.txt
    file1_(1).txt
    file1_(2).txt
    file2.txt
    file2_(1).txt
    file2_(2).txt
    file8.txt
    file8_(1).txt
    file8_(2).txt

Источник После

D:\Folder_Source
│   file4.txt
│   file99.txt
│
├───FolderA
│       file4.txt
│       file99.txt
│
└───FolderB
        file4.txt
        file99.txt

Дополнительные ресурсы

  • FOR /R
  • ЕСЛИ
  • XCOPY
  • DEL
  • ВЫЗОВ

  • Пакетные замены (ЗА /?)

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

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    
  • ЗАДАВАТЬ

    Арифметические выражения (SET /a)

    Поместить выражения в "кавычки" необязательно для простой арифметики, но необходимо для любого выражения, использующего логические операторы.

    Любое вычисление SET /A которое возвращает дробный результат, будет округлено до ближайшего целого числа.

    Выражение для оценки может включать следующие операторы:

    + Add set /a "_num=_num+5"

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