web-dev-qa-db-ja.com

オプションで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は20年以上Unix「cp-u」を複製できなかったようですが、何か見落としているのでしょうか。

3
Paavo

これは必要以上のことかもしれませんが、適切に調整すればうまくいくはずです。いくつか実験を行いましたが、/ Dオプションを指定してxcopyを使用し、宛先ファイル名を指定すると、ファイルが同じかどうかに関係なくコピーを取得できるようです。 (ソースではなく宛先ファイル名に基づいて比較しているようです。)したがって、比較を行うためにxcopyのみを使用し、実際にはコピーを実行しませんでした。 (/ Lオプションを提案してくれたselbieに感謝します。)かなり大きいように見えますが、コメントを削除するとかなり小さくなります。この例では、宛先に存在するが、現在の日付と時刻を使用して新しいファイルをコピーして名前を変更します。コピー先に存在しないファイルをコピーしますが、名前は変更しません(簡単に変更できます)。また、同じファイルはコピーされません。特定のニーズに合わせて変更するお手伝いをします。

@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
2
MegaloDon

文字fを含む1行を含むファイルを作成します(この答えではf.txtになります)。

f.txtの内容をxcopyコマンドにパイプします。

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

これにより、ファイルが存在しない場合に発生する(F = file, D = directory)?プロンプトへの回答が提供されます。

**編集:**これは基本的に、質問に対するRikのコメントの機能を複製していることに気づきました。彼の答えだけが、より簡潔です。

2
Scott McKinney

これは、Windows8および7のエクスプローラーで標準のコピーアンドペーストで実行できると思います。

  1. 「重複の可能性がある」フォルダにファイルをコピーします
  2. コピーがどのコピーを保持するかを尋ねるとき、同じ日付とサイズのファイルをスキップすることを示す下部のボックスにチェックマークを付けます
  3. チェックボックスをオンにして、保存するソース内のすべてを選択し、保持するすべての宛先をチェックします

次に、エクスプローラーは同じ名前のファイルをコピーしますが、新しくコピーされたファイルに番号を追加します。

0
Thmpson

多分これ:

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

あなたはこれを試すことができます:

xcopy "c:\source\a.file" "c:\dest\b.file*" /A /Y 
  • 新しいファイルの最後にある「*」は、プロンプト「ファイルまたはディレクトリ」を削除します
  • 幸運を!

0
paul