特定のファイルをPCからUSBにコピーしたい
私のコード:
xcopy /H /Y /C /R "C:\image1.jpeg" "G:\backup\image.jpeg"
私は次のことをしたい: G:\backup\image1.jpeg が存在する場合、image.jpeg を image2.jpeg として (または別の名前で) コピーし、
image2.jpeg が存在する場合は、image3.jpeg などとしてコピーします。
これを行うことは可能ですか?
特定のファイルをPCからUSBにコピーしたい
私のコード:
xcopy /H /Y /C /R "C:\image1.jpeg" "G:\backup\image.jpeg"
私は次のことをしたい: G:\backup\image1.jpeg が存在する場合、image.jpeg を image2.jpeg として (または別の名前で) コピーし、
image2.jpeg が存在する場合は、image3.jpeg などとしてコピーします。
これを行うことは可能ですか?
ソース名は「image.jpeg」で、宛先にはサフィックスが追加されていると仮定します。
元の名前の終わりと接尾辞の始まりを明確にするために、追加された接尾辞の前にドットを付けることをお勧めします。元の名前の最後にすでに番号が付いている可能性があります。
これは、最大100コピーをサポートする、大雑把ですが非常に効果的なブルートフォース方式です。明らかに、上限は簡単に増やすことができます。
call :backup "c:\image.jpeg"
exit /b
:backup
for /l %%N in (1 1 100) do (
if not exist "G:\backup\%~n1.%%N.%~x1" (
echo F|xcopy %1 "G:\backup\%~n1.%%N.%~x1" >nul
)
exit /b
)
しかし、潜在的な問題があります。image.1.txtとimage.2.txtがすでに存在しているが、image.1.txtを削除するとします。次回バックアップすると、image.1.txtが再作成され、image.2.txtが最新のバックアップであると思われるかもしれません。
以下を使用すると、番号に全体が含まれている場合でも、既存の最大のサフィックスよりも大きいサフィックス1の番号で新しいバックアップを常に作成できます。
@echo off
call :backup "c:\image.jpeg"
exit /b
:backup
setlocal disableDelayedExpansion
set /a n=0
for /f "eol=: delims=" %%A in (
'dir /b "g:\backup\%~n1.*%~x1"^|findstr /rec:"\.[0-9][0-9]*\%~x1"'
) do for %%B in ("%%~nA") do (
setlocal enableDelayedExpansion
set "n2=%%~xB"
set "n2=!n2:~1!"
if !n2! gtr !n! (
for %%N in (!n2!) do (
endlocal
set "n=%%N"
)
) else endlocal
)
set /a n+=1
echo F|xcopy %1 "g:\backup\%~n1.%n%%~x1" >nul