Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WINDOWS 2k8R2:根据目录中较旧文件的名称删除(或执行其他操作)_Windows_Batch File_Batch Processing_String Matching - Fatal编程技术网

WINDOWS 2k8R2:根据目录中较旧文件的名称删除(或执行其他操作)

WINDOWS 2k8R2:根据目录中较旧文件的名称删除(或执行其他操作),windows,batch-file,batch-processing,string-matching,Windows,Batch File,Batch Processing,String Matching,我可以根据当前日期/时间生成目录名:将这些值从WMIC获取到环境变量中以生成: set BackDirName="%year%%month%%day%" mkdir %BackDirName% 在多次运行批处理后,我得到了许多目录,如: 20140901 20140908 ... 20141127 我只想保留一些最新的目录,删除旧的。下面是它在一些抽象伪PL中的外观: rem in this PL array's items numbered starting from 1 declare

我可以根据当前日期/时间生成目录名:将这些值从WMIC获取到环境变量中以生成:

set BackDirName="%year%%month%%day%"
mkdir %BackDirName%
在多次运行批处理后,我得到了许多目录,如:

20140901
20140908
...
20141127
我只想保留一些最新的目录,删除旧的。下面是它在一些抽象伪PL中的外观:

rem in this PL array's items numbered starting from 1
declare var_dir_list:array of string
:start
rem listing all like 20YYMM* - I'll die before year 2100 :-)
list_dirs 20[1-9][0-9][0-1][0-9]* order:alphabetic direction:a-to-z  
    names_per_line:1 show:only-names =>var_dir_list
if number_of_lines(var_dir_list) GT 4 then
    rem deleting first directory in list
    remove_dir name:var_dir_list[1]
    rem removing first line from list
    var_dir_list=var_dir_list[2..number_of_lines(var_dir_list)]
    goto start
end if
上面的伪代码迭代并删除除最后(最新)4个目录之外的所有目录。我需要使用内置的Windows批处理文件处理器来模拟此功能。但是缺乏适当的文档(OMFG!为什么微软没有像2003年那样在2008年发布离线帮助?)让我很生气。 我不能依赖这些文件夹/文件的创建/修改日期,这就是为什么我用它们的名称硬编码日期

如果可能的话,我不知道如何实现这样的功能。有什么切实可行的建议吗?(可以使用VBscript)


谢谢。

此代码获取源目录中所有目录的列表(您必须指定此列表),按日期按相反顺序对其排序,跳过前四个目录,并删除其余目录

@echo off
set source_dir="C:\Where\The\Directories\Are"

:: Takes a list of all directories in the source directory
:: /a:d grabs only directories
:: /:o-d sorts them in reverse by date (newest on top)
:: /b gets simple filenames so that this actually works
:: "skip=4" skips the first four listed
:: rd /s deletes recursively
:: /q forces the deletion without asking
:: and the rest are deleted
for /f "skip=4 tokens=* delims=" %%A in ('dir /a:d /o:-d /b %source_dir%') do rd /s /q %source_dir%\%%A

这就是我完全实现的解决方案。 它可能不是很理想,但它可以工作并允许定制。 优化是值得赞赏的

首先,我需要日期和时间,而不考虑当前的区域设置。然后我制作了两个单独的文件来获取所需的值。我可以在主文件中以“子程序”的形式编写它们的代码,但这些代码是可重用的,我更喜欢将它们作为“外部库”

GetDateTime.bat

rem GetDateTime.bat
rem Reading date and time into environment variables
rem This file should be CALLed from other .bats
for /f %%a in ('wmic path win32_localtime get dayofweek /format:list ^| findstr "="') do (set %%a)
for /f %%a in ('wmic path win32_localtime get day /format:list ^| findstr "="') do (set %%a)
for /f %%a in ('wmic path win32_localtime get month /format:list ^| findstr "="') do (set %%a)
for /f %%a in ('wmic path win32_localtime get year /format:list ^| findstr "="') do (set %%a)
for /f %%a in ('wmic path win32_localtime get hour /format:list ^| findstr "="') do (set %%a)
for /f %%a in ('wmic path win32_localtime get minute /format:list ^| findstr "="') do (set %%a)
rem echo -%dayofweek%-
rem echo %year%-%month%-%day% %hour%:%minute%
蝙蝠

rem normalizeDT.bat
rem Normalize some values, adding leading zeros if needed
if /i %month% lss 10 (
set mon1=0%month%
) else (
set mon1=%month%
)
if /i %day% lss 10 (
set day1=0%day%
) else (
set day1=%day%
)
if /i %hour% lss 10 (
set hou1=0%hour%
) else (
set hou1=%hour%
)
if /i %minute% lss 10 (
set min1=0%minute%
) else (
set min1=%minute%
)
set month=%mon1%
set day=%day1%
set minute=%min1%
set hour=%hou1%
然后是主文件。它可能会在每次启动,但只会在周一创建新备份

weeklyFullBackup.bat

@echo off
@rem weeklyFullBackup.bat
@rem creating full/incremental backup

setlocal

@rem Base directory for creating subdirectories for backups
set BackUpBaseDir=d:\usrback

@rem The prefix for name of backup subdirectories
set BackDirNamePrefix=WBK

@rem How many old backups to store
set MaxBackNumber=4

@rem The directory to be backed up
set BackUpThis=c:\share

@rem Directory for storing RoboCopy logs
set RCLogDir=d:\var\log

@rem Reading date, time and the day of week (latter not used now, but may be used later)
@call getdatetime
@call normalizeDT

@rem Temporary files name - may differ from the name of backup directory!
set tempDT=%year%%month%%day%%hour%%minute%

@rem Resetting the flags, they can be set during ARGS parsing
set DoForce=
set DoNotPurge=
set ParametersAreCorrect=

@rem Parsing possible command line parameter
@rem Several ECHOS like "not forced" are for debugging purposes
if "%1"=="" (
echo No parameters. Behaving default.
set ParametersAreCorrect=YES
)
if "%1"=="/f" (
set DoForce=YES
set ParametersAreCorrect=YES
echo Forcing new backup
) else (
echo Not forced by /f
)
if "%1"=="/n" (
set DoNotPurge=YES
set ParametersAreCorrect=YES
echo Forcing NOT to purge old backups
) else (
echo Not forced by /n
)
if "%1"=="/fn" (
echo Forcing new backup
echo Forcing NOT to purge old backups
set DoForce=YES
set DoNotPurge=YES
set ParametersAreCorrect=YES
) else (
echo Not forced by /fn
)

if "%1"=="/?" (
:HelpAndExit
echo "%0 [/f|/n|/fn]"
echo /f - Force creation of new backup even if today is not Monday
echo /n - Not erase old backups
echo /fn - force and not erase
goto :eof
)

@rem ParametersAreCorrect become non-empy on acceptable parameter detection
@rem If the parameter is non-acceptable, we'll show the help and then quit
@rem It's weird to jump to a label inside compound operator, but it works.
if "%ParametersAreCorrect%"=="" (
echo Wrong parameters!
echo.
goto HelpAndExit
)

:WorkingNow

@rem Forcing creation of new backup if thoday is Monday
if "%DayOfWeek%"=="1" (
set DoForce=YES
echo Monday - Forcing new backup
)
@rem on Monday creating new subdirectory for new backup, on other day of week using last existing one
@rem If there was parameter /f or /fn, we pretend that today is Monday and forcing new backup
if "%DoForce%"=="YES" goto ItIsMonday

echo Not Monday, neither we forced to work, so will not create new backup subdir
@rem ==================================
@rem lookig for last backup subdirectory and using it
@rem sorting subdirs from oldest to newest to skip all but last one
dir /ad /b /on %BackupBaseDir%\%BackDirNamePrefix%*>"%tempDT%.tmp"
@rem FINDing the ":LPT:" string - it can't appear in file/directory name
type "%tempDT%.tmp"|find /c /v ":LPT:">"%tempDT%n.tmp"
@rem Setting environment variable from file
set /p NumOfDirs=<"%tempDT%n.tmp"
@rem Skipping all lines but last one
set /a NumOfDirs-=1
for /f "usebackq skip=%NumOfDirs%" %%I in (`type "%tempDT%.tmp"`) do (
echo Using [%%I]
set BackDirName=%%I
)
@rem ==================================

@rem we don't need to create new backup directory, then skipping the creation code
goto SkipMKDIR

:ItIsMonday

set BackDirName=%BackDirNamePrefix%%year%%month%%day%
if "%DayOfWeek%"=="1" (
echo "Today (%year%-%month%-%day%) is Monday"
) else (
echo "Today (%year%-%month%-%day%) is NOT Monday, but new backup is forced"
)
echo creating [%BackDirName%]
@rem On Mondays checking the existence of subdirectory - just for case
if exist "%BackupBaseDir%\%BackDirName%" (
echo dir is already exists [%BackupBaseDir%\%BackDirName%]
goto SkipMKDIR
)
echo dir is not exists [%BackupBaseDir%\%BackDirName%]

@rem To catch possible errors during MKDIR we turning off the extended commands handling:
@rem I will not create the entire path: if BaseDir not exists, then something is wrong
cmd /e:off /c mkdir %BackupBaseDir%\%BackDirName%
if errorlevel 1 (
echo Can't create dir [%BackupBaseDir%\%BackDirName%]
echo Aborting!
exit
)
:SkipMKDIR

@rem The backup itself
robocopy %BackUpThis% %BackupBaseDir%\%BackDirName% /copy:DATO /xf "~*.*" *.tmp *.wbk thumbs.db /xd ".recycle" /e /r:1 /w:5 /unilog:"%RCLogDir%\%TempDT%.RC.log" /dcopy:t /mt
set RoboErr=%errorlevel%
echo RoboCopy returned [%RoboErr%]
@rem RoboCopy's return codes taken here:
@rem http://technet.microsoft.com/en-us/library/cc733145%28v=ws.10%29.aspx
if /i %RoboErr% geq 8 (
echo Something wrong with this backup. NOT removing old backups, regardless of forsage state
echo Do not removing temporary files %TempDT%*.*
echo Consult log file [%RCLogDir%\%TempDT%.RC.log]
goto :eof
)
rem On successful new backup we may remove older ones.

if "%DoNotPurge%"=="YES" (
echo Forced to NOT remove old backups, skipping removal
goto SkipOldRemoval
)

@rem Very similar to above: getting list of existing backup directories and
@rem removing all but given number of them
dir /ad /b /o-n %BackupBaseDir%\%BackDirNamePrefix%*>"%tempDT%.tmp"
type "%tempDT%.tmp"|find /c /v ":LPT:">"%tempDT%n.tmp"
set /p NumOfDirs=<"%tempDT%n.tmp"

if /i %NumOfDirs% leq %MaxBackNumber% (
@rem Do nothing if there's not enough old backups
echo NOT removing old backups: %NumOfDirs% Less than %MaxBackNumber%.
goto SkipOldRemoval
)
@rem There's enough old backups, we should delete some
echo REMOVING old backups!: %NumOfDirs% Greater than %MaxBackNumber%

for /f "usebackq skip=%MaxBackNumber%" %%I in (`type "%tempDT%.tmp"`) do (
echo Removing [%%I]
rmdir /s /q %BackupBaseDir%\%%I
)

:SkipOldRemoval

@rem House cleaning
del "%tempDT%*.tmp"
endlocal
@echo关闭
@rem weeklyFullBackup.bat
@rem创建完整/增量备份
setlocal
@用于创建备份子目录的rem基本目录
设置BackUpBaseDir=d:\usrback
@rem备份子目录名称的前缀
设置BackDirNamePrefix=WBK
@rem要存储多少旧备份
设置MaxBackNumber=4
@rem要备份的目录
设置备份此=c:\share
@用于存储RoboCopy日志的rem目录
设置RCLogDir=d:\var\log
@rem读取日期、时间和星期几(后者现在不使用,但以后可能使用)
@调用getdatetime
@调用normalizeDT
@rem临时文件名称-可能与备份目录的名称不同!
设置时间=%year%%month%%day%%hour%%minute%
@rem重置标志时,可以在ARGS解析期间设置这些标志
定力=
设置不清除=
设置参数更正=
@rem解析可能的命令行参数
@rem几个回音,如“not forced”,用于调试目的
如果“%1”=“”(
不回显任何参数。行为默认。
设置参数RECORRECT=是
)
如果“%1”==“f”(
设置DoForce=YES
设置参数RECORRECT=是
回声强制新备份
)否则(
回声未被/f强制
)
如果“%1”=“/n”(
设置DoNotPurge=YES
设置参数RECORRECT=是
echo强制不清除旧备份
)否则(
回声不是由/n强制的
)
如果“%1”=“/fn”(
回声强制新备份
echo强制不清除旧备份
设置DoForce=YES
设置DoNotPurge=YES
设置参数RECORRECT=是
)否则(
回声不是由/fn强制的
)
如果“%1”=“/?”(
:HelpAndExit
回显“%0[/f|/n|/fn]”
echo/f-强制创建新备份,即使今天不是星期一
echo/n-不擦除旧备份
echo/fn-强制而非擦除
后藤:eof
)
@rem参数在可接受的参数检测中变为非empy
@rem如果参数不可接受,我们将显示帮助,然后退出
@rem在复合运算符中跳转到标签是很奇怪的,但它是有效的。
如果“%ParametersRecorrect%”(
回显错误的参数!
回声。
去帮助和退出
)
:正在工作
@如果当天是星期一,rem将强制创建新备份
如果“%DayOfWeek%”=1(
设置DoForce=YES
echo Monday-强制执行新备份
)
@rem在周一创建新的子目录用于新备份,在一周的另一天使用最后一个现有子目录
@rem如果有参数/f或/fn,我们假设今天是星期一,并强制执行新备份
如果“%DoForce%”==“YES”则转到ItIsMonday
echo不是周一,我们也不是被迫工作,所以不会创建新的备份子目录
@雷姆==================================
@rem查找最后一个备份子目录并使用它
@rem从最早到最新对子曲面进行排序,以跳过除最后一个子曲面以外的所有子曲面
dir/ad/b/on%BackupBaseDir%\%BackDirNamePrefix%*>%tempDT%.tmp
@rem正在查找“:LPT:”字符串-它不能出现在文件/目录名中
键入“%tempDT%.tmp”|查找/c/v:LPT:“>%tempDT%n.tmp”
@rem设置文件中的环境变量

set/p numodirs=您还应该在Windows2k8R2上安装powershell。可能比批处理容易得多。@Blorgbeard以及2008r2附带了多少关于PS的文档?在没有互联网的地方工作就足够了吗?不知道,只是需要调查一下。在你回答之前,我已经了解了你的想法并实施了它。但感谢您的回答和优化。但是我不同意你对我的问题所做的编辑:通过bashshell和大量的命令行实用程序,IRL可以更轻松地解决这个问题。我在windows中缺少“man”和(尤其是!)“apropos”命令。“command/?”是不一样的,因为缺少“寻呼机”,允许搜索等…我基本上摆脱了“不要问我为什么需要这个;我只是需要”这一点。没有人关心你为什么需要它,很明显你需要它,否则你就不会在这里发布。别怪我。我见过太多的论坛,提问者会得到“答案”,比如“为什么有人需要这个?”典型情况:Q:-嘿,伙计们!我想用显微镜敲打钉子。请给我推荐最合适的型号?A1:-没有人会将显微镜用作锤子!你不应该那样做。A2:-像我爷爷经常做的那样,用粘土砖等等。。。结果:大量的答案像A1和A2,没有人真正回答了问题。好的,也许SE是一个更好的社区,人们在这里回答问题,正如当地公司所要求的那样