Как дополнительно скопировать и переименовать файл в Windows?

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

copy /Y c:\source\a.file c:\dest\b.file 

- всегда копирует, нет опции /D или что-то

xcopy /Y /D c:\source\a.file c:\dest\b.file

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

robocopy /XO ... 

- не поддерживает переименование файла.

Кажется, что Windows не удалось воспроизвести Unix "cp -u" за 20 с лишним лет, или я что-то пропустил?

5 ответов

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

@ECHO OFF
REM ### Note that this assumes all filenames end with ".txt".  This can be changed to suit your needs ###

REM ### Needed so the variables will expand properly within the FOR DO loops ###
Setlocal EnableDelayedExpansion

REM ### Set the source file(s) and call the "CopyIt" subroutine ###
SET Sourcefile=Test 1.txt
CALL :CopyIt

SET Sourcefile=Test2.txt
CALL :CopyIt

REM ### End of the program.  Otherwise the subroutine will run again ###
REM ### You can also just put an "EXIT" command here ###
GOTO END

REM ### The subroutine ###
:CopyIt
    REM ### Set the date and time to a variable called "DaTime" and remove offending ###
    REM ### characters (/ and :) that can't be used in a filename ###
    FOR /f "tokens=1-4 delims=/ " %%a in ("!date!") do SET DaTime=%%b-%%c-%%d
    FOR /f "tokens=1-3 delims=':'" %%e in ("!time!") do SET DaTime=!DaTime!_%%e-%%f-%%g

    REM ### Set a variable called "DestFile" to source filename minus ".txt" ###
    REM ### to be used to set the new destination file name + "DaTime" ###
    SET Destfile=!Sourcefile:.txt=!

    REM ### Check to see if the source filename exists in the destination directory ###
    DIR "C:\_Dest\!Sourcefile!" > NUL
    IF !ErrorLevel!==0 (
        REM ### If it does exist, set the loop count to 0 ###
        SET /a Count=0
        REM ### Have xcopy check to see if the source file is newer, but only report and not copy ###
        REM ### Thanks to selbie for suggesting the /L option ###
        FOR /f "tokens=1 delims=0" %%s in ('xcopy /Y /D /L "C:\_Source\!Sourcefile!" "C:\_Dest\"') DO (
            REM ### Increment the loop count ###
            SET /a Count=!Count!+1
            REM ### Only pick up the first iteration.  If the files are different, it will be the full path and the filename ###
            If !Count!==1 SET Source=%%s
        )
        REM ### If the source is the same as the destination, then !Source! will = " File(s)".  Change it to NONE ###
        SET Source=!Source: File^(s^)=NONE!
        REM ### If it's not equal to NONE, copy the file and rename it to source file + date & time + .txt ###
        IF !Source! NEQ NONE COPY /Y "!Source!" "C:\_Dest\!Destfile!-!DaTime!.txt"
    ) ELSE (
        REM ### If it does not exist, copy the file without renaming it ###
        COPY /Y "C:\_Source\!Sourcefile!" "C:\_Dest\"
    )
REM ### Exit the subroutine ###
EXIT /b

:END
pause

Создайте файл, содержащий одну строку с буквой f в этом (назовите это как хотите, для этого ответа это будет f.txt).

Передайте содержимое f.txt к команде xcopy:

xcopy /Y /D c:\source\a.file c:\dest\b.file<f.txt

Это даст ответ на (F = file, D = directory)? подсказка, которая появляется, если файл не существует.

** Редактировать:** Просто понял, что это в основном дублирует функциональность комментария Рика на вопрос, только его ответ является более кратким.

Вы можете попробовать это:

xcopy "c:\source\a.file" "c:\dest\b.file*" /A /Y 
  • / Y удалить подсказку перезаписи
  • "*" в конце нового файла для удаления подсказки "Файл или каталог"

Удачи!

Может быть, это:

xcopy /I /Y /D c:\source\a.file c:\dest\b.file

Вы можете сделать это с помощью стандартного копирования и вставки в Проводнике на Windows 8 и 7, я думаю.

  1. Скопируйте файлы в папку с "возможными дубликатами"
  2. Когда копия запрашивает, какую копию сохранить, поставьте галочку в нижней части, говоря, что файлы должны быть пропущены с одинаковой датой и размером.
  3. Установите флажок, чтобы выбрать все в источнике, чтобы сохранить и отметьте все место назначения, чтобы сохранить

Затем Explorer скопирует файлы с тем же именем, но добавит число к вновь скопированному.

Другие вопросы по тегам