Batch file 将2只蝙蝠合并为一只蝙蝠

Batch file 将2只蝙蝠合并为一只蝙蝠,batch-file,Batch File,我有以下脚本: @echo off & setlocal del /f /s /q %temp%\DuplicateRemover.txt del /f /s /q %temp%\DuplicateRemover.bat echo SetLocal DisableDelayedExpansion >>%temp%\DuplicateRemover.txt echo @echo off ^& setlocal >>%temp%\DuplicateRem

我有以下脚本:

@echo off & setlocal
del /f /s /q  %temp%\DuplicateRemover.txt 
del /f /s /q %temp%\DuplicateRemover.bat

echo SetLocal DisableDelayedExpansion >>%temp%\DuplicateRemover.txt
echo @echo off ^& setlocal >>%temp%\DuplicateRemover.txt
echo rem Group all file names by size >>%temp%\DuplicateRemover.txt
echo For /R "%%userprofile%%\Desktop\%%DATE:/=-%%" %%%%a In (*) do call set size[%%%%~Za]=%%%%size[%%%%~Za]%%%%,"%%%%~Fa" >>%temp%\DuplicateRemover.txt
echo rem Process groups >>%temp%\DuplicateRemover.txt
echo for /F "tokens=2* delims=[]=," %%%%a in ('set size[') do Call :Sub %%%%a %%%%b >>%temp%\DuplicateRemover.txt
echo Goto ^:Eof >>%temp%\DuplicateRemover.txt
echo ^:Sub >>%temp%\DuplicateRemover.txt
echo If "%%~3"=="" (Set "size[%%1]="^&goto :EOf) >>%temp%\DuplicateRemover.txt
echo processing %%* >> %temp%\DuplicateRemover.txt
echo Keep %%2 >> %temp%\DuplicateRemover.txt
echo Shift^&shift >> %temp%\DuplicateRemover.txt
echo :loop >> %temp%\DuplicateRemover.txt
echo Del  %%1 >> %temp%\DuplicateRemover.txt
echo if not "%%~2"=="" (shift^&goto :loop) >>%temp%\DuplicateRemover.txt

ren "%temp%\DuplicateRemover.txt" DuplicateRemover.bat

set "spool=%systemroot%\System32\spool\PRINTERS"
set "output=%userprofile%\Desktop\%date:/=-%"

rem Timeout for loop cycle.
set "sleeptime=1"

if not exist "%output%" mkdir "%output%"


:loop

setlocal
call %temp%\DuplicateRemover.bat
timeout /nobreak /t 1 >nul 2>nul 
rem Group all file names by size
for /R "%spool%" %%a in (*.spl) do call set size[%%~Za]=%%size[%%~Za]%%,"%%~Fa"
2>nul set size[|| (
    endlocal
    >nul timeout /t %sleeptime% /nobreak
    goto :loop
)
rem Process groups
for /F "tokens=2* delims=[]=," %%a in ('set size[') do call :Sub %%a %%b

endlocal
>nul timeout /t %sleeptime% /nobreak
goto :loop

exit /b 0

:Sub
setlocal

@rem If "%~3"=="" (set "size[%1]=" & exit /b 1)
echo processing %*

rem Skip 1st argument.
set "skip1="

for %%a in (%*) do (
    if not defined skip1 (
        set skip1=1
    ) else if not exist "%output%\%%~NXa" (
        rem Unique name
        echo Keep: "%%~a"
        copy "%%~a" "%output%\%%~NXa" >nul 2>nul
    ) else (
        for %%b in ("%output%\%%~NXa") do (
            for %%c in ("%%~a") do (
                if "%%~Zb" == "%%~Zc" (
                    rem Same name same size
                    call :SaveAs "%%~a" "%output%\%%~NXa"
                ) else (
                    rem Same name different size
                    call :SaveAs "%%~a" "%output%\%%~NXa"
                )
            )
        )
    )
)
exit /b 0

rem Renames to output with an index number.
:SaveAs
setlocal
set "name=%~dpn2"
:NewNameLoop
set /a i+=1
if exist "%name%(%i%).spl" goto :NewNameLoop
echo Keep: "%~1" as "%name%(%i%).spl"
copy "%~1" "%name%(%i%).spl" >nul 2>nul
exit /b 0
当脚本运行时,它会创建另一个与主脚本一起工作的
.bat
。 主脚本从假脱机复制文件并将其粘贴到输出文件夹中,而不停止复制同一文件。第二个脚本的功能是删除这些重复的文件,通过特定的文件大小识别它

它的工作效率高达75%。有时第二个脚本没有时间删除重复的文件。我想最好将这两个脚本合并在一个脚本中。因此,它将工作得更好


有人能帮我怎么做吗?

为什么文件大小相同? 这些在不同的文件夹中吗

您可以通过使用


如果我们提供帮助,你愿意吗?我这样问是因为与这里的大多数问题不同,这里使用的示例代码很少,通常是假的,相比之下,您的请求可能会占用大量的时间。正如你所能想象的那样,花时间解决别人的问题,只是一时兴起将其删除,并不能提供太多的动力。这里有五行示例代码供你看,你认为它会完全取代
DuplicateRemover.bat
@Echo Off&SetLocal enabledextensions DisableDelayedExpansion
num | | Exit/BFor/F“Delims==”%A In('Set size[2^>num')Do Set%%A=“
For%%A In(*)Do If Defined size[%~zA](Del“%~fA”)or Set”size[%~zA]=T”
EndLocal&GoTo:EOF
。我还注意到,您实际上已经在代码的其他地方复制了这种结构,如果您发现它满足了您的需要,也许您可以对其进行类似的调整!@Compo首先,我删除了这个问题,因为没有人回答,您只是在注释中提供了帮助,所以我删除了它,以免混淆其他人I don’我没有同样的问题,正在寻求帮助。第二,再次感谢你的帮助。我复制了这个结构,因为它对我来说更容易。但我已经得到了。再次感谢!(我知道你也对我的帖子投了反对票……不管怎样,就像你的帮助一样……)Karen,我最后一次回复你是在周六凌晨1:00之后。对我们大多数人来说,这是周末,我们中的一些人需要睡觉。我们是一个在不同时区的多元化世界社区,所以在你最近的问题编辑后不到四个小时删除你的问题,因为没有人回答这一问题有点过早。还有just为了让您和任何其他读者都知道,我将始终通知一位成员我对他们投了否决票,并说明原因。我从未对您的任何问题投过否决票!@Compo您是对的。我现在将等待更多。谢谢。
@echo off
setlocal
set prompt=$g$s

:: This is a versioning system
:: Transfer of none or one or more parameters (folders / files)
:: A folder is created on the same level as the original folder.
:: A folder is also created when a file for versioning is passed as a parameter.
:: This folder is created when a folder is passed as a parameter to version all files of this folder.
:: Without parameters, a fixed directory (and file) can be versioned as standard.
:: A log file is maintained in the versioning folder.
:: Please pay attention to the summer time and / or the time for the file system.
:: The variable rCopyCMD is used to pass other Robocopy options.
:: The versioned file gets the current time stamp as a version feature.

set       "folderOriginal=d:\WorkingDir"

::::::::::::::::::::::::::::::::::::::::::::::
set        "filesOriginal=*"
set        "folderVersions=.Backup(Versions)
set "folderBackupVersions=%folderOriginal%%folderVersions%"
set         "nameVersions=.(v-timeStamp)"
set      "fileLogVersions=%folderBackupVersions%\Log.(Versions).log"

:getAllParameters
if :%1 equ : goto :EndParameter
if exist %1\ (
  set       "FolderOriginal=%~1"
  set "folderBackupVersions=%~1%folderVersions%"
  set        "filesOriginal=*"
) else (
  set       "FolderOriginal=%~dp1"
  for %%i in ("%~dp1\.") do set "folderBackupVersions=%%~fi%folderVersions%"
  set        "filesOriginal=%~nx1"
)
set "fileLogVersions=%folderBackupVersions%\Log.(Versions).log"

:EndParameter

call :TAB
set "timeStamp=."

set "rCopyCmd= /njh /ts /fp /ns /nc /np /ndl /njs "

for %%F in ("%folderOriginal%\%filesOriginal%"
) do (
  set "timeStampFileName="
  set "versionTimeStamp="
  for /f "tokens=2,3delims=%TAB%" %%A in ('
    robocopy /L "%folderBackupVersions%" ".. versions Listing only..\\" ^
     "%%~nF%nameVersions:timeStamp=*%%%~xF" %rCopyCmd% ^|sort ^& ^
    robocopy /L "%%~dpF\" ".. original List only ..\\" "%%~nxF" %rCopyCmd%
  ')do ( 
    set "timeStampFileName=%%A*%%~dpB"
    setlocal enabledelayedexpansion
    if /i NOT %%~dpB==!folderBackupVersions!\ if %%A gtr !versionTimeStamp! (
      call :getCurrent.timestamp
      for /f "tokens=1-3delims=*" %%S in ("%nameVersions:timeStamp=!timeStamp!%*!timeStampFileName!"
      ) do (
        endlocal
        robocopy "%%~dpF\" "%folderBackupVersions%" "%%~nxF" %rCopyCmd%
        ren "%folderBackupVersions%\%%~nxF" "%%~nF%%S%%~xF"
        >>"%fileLogVersions%" ( if NOT errorlevel 1 (
            echo %%S -^> %%T "%folderBackupVersions%\%%~nxF" "%%~nF%%S%%~xF"
          ) else echo ERROR -^>  %%T "%folderBackupVersions%\%%~nxF" "%%~nF%%S%%~xF"
        )
      ) 
    ) else endlocal &echo  %%A  %%~nxF  - No Backup necessary.
    if .==.!! endlocal
    set "versionTimeStamp=%%A"
  )
)
if NOT :%2==: shift & goto :getAllParameters
pause
exit /b

:TAB
for /f "delims= " %%T in ('robocopy /L . . /njh /njs') do set "TAB=%%T"
 rem END TAB
exit /b

:getCurrent.timestamp
 rem robocopy /L "\.. Timestamp ..\\" .
for /f "eol=D tokens=1-6 delims=/: " %%T in (' robocopy /L  /njh "\|" .^|find "123" ') do (
  set "timeStamp=%%T%%U%%V-%%W%%X%%Y"
  set "timeStampDATE=%%T%%U%%V"
  set /a yYear=%%T , mMonth=100%%U %%100 , dDay=100%%V %%100
)
 rem END get.currentTimestamp
exit /b