【问题标题】:Batch File that delete FOLDERS older than 7 days based on FOLDER name date根据文件夹名称日期删除超过 7 天的文件夹的批处理文件
【发布时间】:2020-05-29 01:59:13
【问题描述】:

我是 Marvin,我想编写一个批处理文件(适用于 windows 命令提示符),它将删除特定文件夹中所有 7 天以上的文件夹,但基于文件名中写入的日期和不是文件的修改日期。

这是文件夹中文件的命名方式,它们都遵循这个特定的模板:CYYYYMMDDHHMMSS

提前感谢您的帮助。

对不起这个问题。我对创建批处理文件知之甚少。我尝试在与我关注的其他线程相关的其他线程上复制一些解决方案,但他们的问题是带有扩展名的文件删除。我担心的是使用我上面已经提到的文件名模板删除文件夹。

这是我基于文件夹名称格式和文件夹路径/位置的示例代码: 文件夹名称格式:CYYYYMMDDHHMMSS(例如 C20200527180716、C20200528123944) 文件夹路径:F:/v9Backup

@echo off
setlocal
set "folder=F:\v9backup"

REM set the number of days to substract
SET DAYS=7

REM Call function to check if the date is valid.
CALL :validdate "%days%" subdate
echo Older than: %subdate%
pushd "%folder%"

REM Get a list of the files
REM file pattern is: CYYYYMMDDHHMMSS
set "search=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
FOR /F "tokens=1,2* delims=_" %%G IN ('dir /a-d /b C* 2^>nul ^|findstr /I /R /C:"^C%search%"') DO (
setlocal enabledelayedexpansion
set "fdate=%%H"
set "fdate=!fdate:~0,8!"
IF !fdate! lss %subdate% del "%%G_%%H_%%I"
endlocal
)
popd
pause

endlocal
GOTO :EOF

:validdate
setlocal
set "day=%~1"
set rand=%random%
md "%temp%\dummy%rand%\empty%rand%"

REM Get todays date
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do 
set "dt=%%a"

REM set year month and day into its own variables.
set /a y=%dt:~0,4%
set /a m=1%dt:~4,2%
set /a d=1%dt:~6,2%

:loop
if "%day%"=="0" (
rd /s /q "%temp%\dummy%rand%"
endlocal &set "%~2=%y%%m:~-2%%d:~-2%"
GOTO :EOF
)
set /a d-=1

if %d% lss 101 (
set d=131
set /a m-=1

if %m% lss 101 (
    set m=112
    set /a y-=1
)
)

xcopy /d:%m:~-2%-%d:~-2%-%y% /t "%temp%\dummy%rand%\empty%rand%" 
"%temp%\dummy%rand%" >nul 2>&1 && (set /a day-=1 & goto loop) || goto loop

GOTO :EOF

但是,它运行不正常。你能帮我解决这些问题吗?

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    马文 - 试试这个。我也是新手,但相信这个修改后的脚本会满足您的需求。我已根据您的规范对其进行了修改,并删除了需要按键才能完成脚本的暂停。

    @echo off
    setlocal
    set "folder=F:\v9backup"
    
    REM set the number of days to substract
    SET DAYS=7
    
    REM Call function to check if the date is valid.
    CALL :validdate "%days%" subdate
    echo Older than: %subdate%
    pushd "%folder%"
    
    REM Get a list of the files
    REM file pattern is: CYYYYMMDDHHMMSS
    set "search=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
    FOR /F "tokens=1,2* delims=C" %%G IN ('dir /a:d /b * 2^>nul ^|findstr /I /R /C:"^C%search%"') DO (
        setlocal enabledelayedexpansion
        set "fdate=%%G"
        set "fdate=!fdate:~0,8!"
        IF !fdate! lss %subdate% del /f /s /q "C%%G" 1>nul
        IF !fdate! lss %subdate% rmdir /s /q "C%%G"
        endlocal
    )
    popd
    
    endlocal
    GOTO :EOF
    
    :validdate
    setlocal
    set "day=%~1"
    set rand=%random%
    md "%temp%\dummy%rand%\empty%rand%"
    
    REM Get todays date
    for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
    
    REM set year month and day into its own variables.
    set /a y=%dt:~0,4%
    set /a m=1%dt:~4,2%
    set /a d=1%dt:~6,2%
    
    :loop
    if "%day%"=="0" (
        rd /s /q "%temp%\dummy%rand%"
        endlocal &set "%~2=%y%%m:~-2%%d:~-2%"
        GOTO :EOF
    )
    set /a d-=1
    
    if %d% lss 101 (
        set d=131
        set /a m-=1
    
        if %m% lss 101 (
            set m=112
            set /a y-=1
        )
    )
    
    xcopy /d:%m:~-2%-%d:~-2%-%y% /t "%temp%\dummy%rand%\empty%rand%" "%temp%\dummy%rand%" >nul 2>&1 && (set /a day-=1 & goto loop) || goto loop
    
    GOTO :EOF
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-26
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2018-12-23
      • 1970-01-01
      相关资源
      最近更新 更多