【问题标题】:Batch - How to rename and move file, if file already exists批处理 - 如果文件已存在,如何重命名和移动文件
【发布时间】:2016-08-16 07:32:56
【问题描述】:

美好的一天!

所以,我的问题是,我正在制作脚本,它将档案从一个文件夹移动到另一个文件夹。问题是,如果存档已经存在,那么第二个文件夹中的存档将被替换。

这些是备份档案,我想在任何给定日期创建备份。

这是我目前所拥有的:

set year=%DATE:~6,4%

if not exist "V:\01_%YEAR%" mkdir "V:\01_%YEAR%"  - Creates folder 01_2016
for /d %%X in (01_%YEAR%) do "C:\Program Files\7-Zip\7z.exe" a "%%X.7z" "%%X\" - Archivates folder
MOVE "V:\01_%YEAR%.7z" "Z:\"  - moves Archive.

现在,想法是,我编写简单的 If exists 代码,将我要发送的存档重命名为类似这样的名称 - 01_%YEAR%(1),然后发送到文件夹。

这是我想出的:

if exist "Z:\01_%YEAR%.7z" (
ren V:\01_%YEAR%.7z 01_%YEAR%(1).7z
)

当然我的想法是完全错误的,因为下次我将运行这个脚本,存档将被任何方式替换。

那么,我的问题是,如何改进我的代码?

问候

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    这可能会有所帮助...

    你需要

    setlocal enabledelayedexpansion
    

    替换

    MOVE "V:\01_%YEAR%.7z" "Z:\"
    

    通过

    set "last=0"
    set "filename=Z:\01_%YEAR%.7z"
    
    if exist "Z:\01_%YEAR%.7z" (
        for /R %%i in ("Z:\01_%YEAR%(*).7z") do (
           for /F "tokens=2 delims=(^)" %%a in ("%%i") do if %%a GTR !last! set "last=%%a"
        )
        set/a last+=1
        set "filename=Z:\01_%YEAR%(!last!).7z"    
    )    
    
    MOVE "V:\01_%YEAR%.7z" "%filename%"
    

    编辑:简要说明

    首先,我们设置所需的目标文件名Z:\01_%YEAR%.7z

    然后我们检查文件是否已经存在。如果没有,我们跳过该块,因此 move 将使用文件名的内容,即未触及 Z:\01_%YEAR%.7z

    但如果文件存在,我们进入块。

    第一个 for 检查所有出现的模式 Z:\01_%YEAR%(*).7z 其中 * 可以是任何东西。

    同样,如果没有任何匹配,我们跳转到 set/a last+=1(在 last=0 之前,现在 last=1),所以文件名现在将是 Z :\01_%YEAR%(1).7z

    如果有任何匹配,第二个 for 将被执行。这里扫描第一个块的结果,并提取括号之间的部分。所以它可能是 1,2,3,... 来自以前的处决。曾经,没有更多匹配我们到达 set/a last+=1 行,但现在(即来自上一个)作为 last=1,在 set 之后/a last+=1, last=2,所以文件名现在将是 Z:\01_%YEAR%(2).7z

    所以每次 (*) 部分加一。

    注意:这不是完美的代码,因为for /R 中的 * 可能会返回字符串,但这是一个很好的起点

    输入 for /? 了解更多详情

    希望对你有帮助

    【讨论】:

    • 嘿,哇,我是创建批处理脚本的新手,所以我想问你,你能解释一下,这段代码是如何工作的吗?或者特别是 MOVE "V:\01_%YEAR%.7z" "%filename%" ?非常感谢。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多