tri*_*ium 1 scripting dos batch-file windows-scripting
我有一个目录,包含我需要处理的数千个文本文件.其中一些文件是相同的,而其他文件是相同的,除了时间戳变化几秒/毫秒.我需要一些方法来自动删除相同的文件,只保留一个副本.
我想的是:
while there are files in the directory still
{
get file // e.g., file0001
while (file == file + 1) // e.g., file0001 == file0002 using 'fc' command
{
delete file + 1
}
move file to another directory
}
Run Code Online (Sandbox Code Playgroud)
在Microsoft Windows Server 2003的DOS中,甚至可以这样吗?
当然如此.一切皆有可能.:d
此批处理实际上不会删除文件.它只是回应比较的结果.如果找到两个相同的文件,则可以删除其中一个文件.
将代码保存为CleanDuplicates.bat并启动程序CleanDuplicates {Folder}
按原样提供,没有任何保证!我不想让你敲门,因为整个服务器搞砸了.;-)
代码实际上是递归调用自己的.这可能以不同的方式完成,但嘿,它的工作原理.它也会在新的cmd中再次启动,因为这样可以更轻松地进行清理.我在Windows Vista Business中测试了该脚本,但它也适用于Server 2003.嘿,它甚至有一个帮助功能.;-)它包含两个循环,每个循环返回每个文件,因此当您实现实际删除时,它可能会报告某些文件不存在,因为它们在之前的迭代中被删除.
@echo off
rem Check input. //, /// and //// are special parameters. No parameter -> help.
if %1check==//check goto innerloop
if %1check==///check goto compare
if %1check==////check goto shell
if %1check==/hcheck goto help
if %1check==check goto help
rem Start ourselves within a new cmd shell. This will automatically return to
rem the original directory, and clear our helper environment vars.
cmd /c %0 //// %1
echo Exiting
goto end
:shell
rem Save the current folder, jump to target folder and set some helper vars
set FCOrgFolder=%CD%
cd %2
set FCStartPath=%0
if not exist %FCStartPath% set FCStartPath=%FCOrgFolder%\%0
rem Outer loop. Get each file and call ourselves with the first special parameter.
for %%a in (*.*) do call %FCStartPath% // "%2" "%%a"
goto end
:innerloop
rem Get each file again and call ourselves again with the second special parameter.
for %%b in (*.*) do call %FCStartPath% /// %2 %3 "%%b"
goto end
:compare
rem Actual compare and some verbose.
if %3==%4 goto end
echo Comparing
echo * %3
echo * %4
fc %3 %4 >nul
rem Get results
if errorlevel 2 goto notexists
if errorlevel 1 goto different
echo Files are identical
goto end
:different
echo Files differ
goto end
:notexists
echo File does not exist
goto end
:help
echo Compares files within a directory.
echo Usage: %0 {directory}
goto end
:end
Run Code Online (Sandbox Code Playgroud)