返回列表 发帖

[文件操作] [已解决]批处理文件已存在则添加序号

各位大佬大家好:

以下是小弟写的最简单的批处理命令:将AAA文件夹里面的内容剪切到BBB文件夹
move C:\Users\dmns25163\Desktop\AAA\*.* C:\Users\dmns25163\Desktop\BBB

当两个文件名相同的时候希望能有些区分,目前想到的届时增加尾缀。
例:新建 Microsoft Access 数据库→新建 Microsoft Access 数据库1→新建 Microsoft Access 数据库2(以此类推)

希望大神给与指导。
1

评分人数

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

回复 1# adfs945


    之前已经有过类似的了,要善于搜索
@echo off
set /p yourprogramname=what your program name:
:start
cd /d "%~dp0"
if not exist %yourprogramname%.txt (
    set /a "fx=0"
)
if exist "%yourprogramname%.txt" (
   set /a "fx=0"
   set /a "b=1"
   set /a "fx=%fx%+1"
   set "OutFile=%yourprogramname%%fx%.txt"
)
if "%fx%" equ "0" (
       set "OutFile=%yourprogramname%.txt"
)
:1
(for /f "delims=" %%i in ('dir /b /a-d *.*') do (
    if "%%i" neq "%OutFile%" (
        echo,%%~ni
    )
))>"%OutFile%"
if exist "%yourprogramname%0 .txt" (
   ren "%yourprogramname%0.txt" "%yourprogramname%1 .txt"
)
pause >nul
goto startCOPY
这个脚本会给出一个类似"文件名0.txt"的,如果不用的话就在进下一个循环的时候改掉"文件名1.txt"
QQ 1980286392

TOP

@echo off
rem 批处理保存为ansi编码格式
set "folder1=C:\Users\dmns25163\Desktop\AAA"
set "folder2=C:\Users\dmns25163\Desktop\BBB"
for %%a in ("%folder1%\*.*") do (
if not exist "%folder2%\%%~nxa" (
move "%%a" "%folder2%"
) else (
call :1
)
)
pause
exit
:1
for /l %%l in (2,1,200) do (
if not exist "%folder2%\%%~na(%%l)%%~xa" (
move "%%a" "%folder2%\%%~na(%%l)%%~xa"
exit /b
)
)COPY

我在写脚本中,发现一个问题。在此请教一下路过的老师、大佬,为什么我把200改为2000000,移动完一个文件后会等待很久才继续移动下一个?echo %%l观察了一下,并没有在循环中,但是实际还是在执行for /l 的循环,数字越大等待越久。
bat小白,请多指教!谢谢!

TOP

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

@echo off  
set source=C:\Users\dmns25163\Desktop\AAA  
set destination=C:\Users\dmns25163\Desktop\BBB
mkdir %destination%
for /r "%source%" %%a in (*) do (  
   set file=%%~nxa  
   if exist "%destination%\%file%" (  
       set /a i=1  
       for %%b in ("%destination%\%~nxa") do (  
           set /a i+=1  
           ren "%destination%\%~nxa" "%destination%\%~nxa!i!"  
       )  
   ) else (  
       move /y "%source%\%%a" "%destination%\%%a"  
   )  
)COPY
这段代码首先创建一个名为 BBB 的新文件夹(如果还不存在),然后进入 AAA 文件夹及其子文件夹。对于每个文件,它首先检查目标文件夹中是否已经存在同名的文件。如果存在,则在文件名后加上一个数字,以区分它们。如果没有,则将文件移动到目标文件夹。
请注意,这个批处理文件假设源文件夹(AAA)和目标文件夹(BBB)都在您的桌面上。如果您希望更改这些文件夹的路径,请更改 `set source` 和 `set destination` 行中的路径。

TOP

回复 5# 447219071


    这代码是错的,你试试就知道了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 77七 于 2023-7-19 22:27 编辑

回复 4# Batcher


   

谢谢站长指点!不过我没明白,我使用exit /b 退出了,应该不会对,2-200全部遍历了吧?
@echo off
for /l %%l in (2,1,200) do (
        >>123.txt echo 1
        exit
)COPY


比如把这个代码单独拿出来,文本也只会产生一个1。
@echo off
for /l %%l in (2,1,2000000) do (
        >>123.txt echo 1
        exit
)COPY


像这样,脚本也是一闪而过就执行完毕,为什么用call之后要等很久?
bat小白,请多指教!谢谢!

TOP

回复 4# Batcher


   站长,我把脚本简化了一下,方便测试
@echo off
echo %time%
call :1
echo %time%
pause
exit
:1
for /l %%l in (2,1,2000000) do (
echo 1
exit /b
)COPY
bat小白,请多指教!谢谢!

TOP

回复 7# 77七
call调用另一个批处理程序或自身程序段,调用完后,程序会回到原来的位置继续执行下去。

TOP

回复 8# 77七


    把 exit /b 改成 exit 就能看出区别
在批处理脚本中,exit 是退出 cmd.exe,而 exit /b 与 goto :EOF 几乎等效,跳转到批处理结尾。

TOP

回复 9# qixiaobin0715


   谢谢大佬指点!我的问题主要如8楼所示,我执行需要5秒,找不到原因。
bat小白,请多指教!谢谢!

TOP

回复 10# WHY


      谢谢大佬指点!我不理解的是为什么执行8楼的脚本需要5秒?
bat小白,请多指教!谢谢!

TOP

回复 12# 77七


    你可以这样理解:
遇到 exit,for /L 循环中的变量不会继续迭代,立马退出 cmd.exe
否则,for /L 循环中的变量会继续迭代,即使遇到 goto :EOF 或 exit/b 也是如此。
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 11# 77七
应当和call关系不大,可能是与预处理有关,单独试试最后一段for循环:
for /l %%l in (2,1,2000000) do (
echo 1
exit /b
)COPY
同样会
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 13# WHY

谢谢大佬指点!看来for /l 中使用 exit /b 或 goto 比较特殊,会增加不必要的迭代时间。
bat小白,请多指教!谢谢!

TOP

返回列表