返回列表 发帖

[文件操作] [已解决]批处理如何复制文件同名不覆盖,且重命名?

for /f "delims=" %%a in ('dir /b /s .\*.txt') do (
copy  "%%a" .\new /-y
)COPY
上述代码只能提醒是否覆盖,我想实现同名文件如F:\1.txt和F:\1\1.txt拷进同一文件夹时,后拷的1.txt变成1(1).txt,求指教
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

批处理复制或重命名文件的时候对重复文件依次添加数字序号
http://bbs.bathome.net/viewthread.php?tid=9355#pid60621
http://bbs.bathome.net/viewthread.php?tid=11423#pid72681

TOP

本帖最后由 WHY 于 2015-8-21 15:50 编辑

一种思路:
把当前目录(包括子目录)的所有文件复制到 d:\new文件夹,遇到同名文件时,自动增加(1)、(2)等编号
如果只需要复制指定类型的文件,修改第4行的 *.* 即可。比如改成 *.txt 就只复制扩展名为txt的文件
1<1/* :
@echo off
md d:\new 2>nul
for /f "tokens=1*delims=/" %%i in ('dir /b /s /a-d *.*^|cscript //Nologo //E:jscript "%~f0"')do (
    copy "%%j" "d:\new\%%i"
)
pause & exit
*/
var map = {};
var str = WScript.StdIn.ReadAll().replace(
    /.+\\(.+)\r\n/g,
    function(a,b){
        var s = '', n = b.toLowerCase();
        map.hasOwnProperty(n)?(map[n]++,s='('+map[n]+')'):map[n]=0;
        b = b.replace(/(.+?)(\.[^.]+|)$/, '$1'+s+'$2');
        return(b + '/' + a);
    }
)
WScript.Echo(str)COPY
1

评分人数

TOP

本帖最后由 pcl_test 于 2015-8-20 11:42 编辑
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /b /s *.txt') do (
    set "fn=%%~nxa"
    set "fn=!fn: =_!"
    if defined #!fn! (
        for %%i in (!fn!) do copy "%%a" "new\%%~na(!#%%i!)%%~xa"
    ) else copy "%%a" "new\"
    set/a #!fn!+=1
)
pauseCOPY

TOP

回复 4# pcl_test


    文件名含 +-~() 等字符呢?

TOP

for + call 方案,但效率绝逼不高
@echo off
for /r %%i in (*) do (
    set "strName=%%~nxi" & set "n="
    call :CP "%%i"
)
pause & exit
:CP
if not exist "d:\new\%strName%" copy "%~1" "d:\new\%strName%" & goto :EOF
if exist "d:\new\%strName%" set /a n+=1
set "strName=%~n1(%n%)%~x1"
goto :CPCOPY

TOP

回复 4# pcl_test


    文件覆盖了,cmd里出现“运算符不存在”这种问题,我电脑问题吗?

TOP

本帖最后由 pcl_test 于 2015-8-20 15:17 编辑

回复 5# WHY

这种方法是有此弊端的,但对于一般的文件名,效果却是极好,故也提一下
回复 7# qq872862088
不是,只是文件名有特殊字符而已

TOP

回复 6# WHY


    测试过,只有2个同名文件,但新文件夹出现3个同名文件,还有for /r %%i in (*) do里的*改成'dir /b /s *.txt'找不到指定文件...不知道怎么改

TOP

回复 8# pcl_test


    的确,没有特殊字符就很好用,但我的文件名大多都是以日期起名的,都带有空格,有什么好方法吗

TOP

回复 10# qq872862088

空格不影响,该是其他字符影响

3楼的dir /b /s /a-d改为dir /b /s /a-d *.txt
或6楼in (*)改为in (*.txt)皆可

TOP

回复 11# pcl_test


    文件名格式就是这样,果然是-号

TOP

本帖最后由 qq872862088 于 2015-8-20 15:55 编辑

回复 3# WHY


    3楼和11楼完美解决了我的问题了,感谢感谢

TOP

回复 4# pcl_test


    for %%i in (!fn!) do
这里有隐患

TOP

另外一种办法:
@echo off & setlocal enabledelayedexpansion   
if not "%~1"==":" (
    md d:\new 2>nul
    for /f "tokens=1*delims=/" %%i in ('"%~f0" :^|sort') do (
        if /i "%%i"=="!strName!" (
            set /a n+=1
            copy "%%j" "d:\new\%%~ni(!n!)%%~xi"
        ) else (
            set "n="
            copy "%%j" d:\new\
        )
        set "strName=%%i"
    )
    pause
) else (
    for /r %%i in (*) do echo %%~nxi/%%i
)COPY

TOP

返回列表