代码之家  ›  专栏  ›  技术社区  ›  Arvo Bowen

批处理(Windows命令提示符)-FORFILES返回“错误:参数不正确。”

  •  0
  • Arvo Bowen  · 技术社区  · 6 年前

    FORFILES 我的windows Server 2012R2服务器上的命令提示符窗口中的命令。。。

    此批处理文件的目的是查看一组目录(带有子目录)并删除X天或更早的文件。

    @ECHO OFF
    CLS
    SETLOCAL EnableDelayedExpansion EnableExtensions
    
    SET "MINDAYSOLD=9"
    SET "TARGETPATH=E:\archives"
    
    SET "PADDEDTIME=%TIME: =0%"
    SET "DATESTAMP=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%"
    SET "LOGFILEPATH=Logs\%~n0-%DATESTAMP%.log"
    SET "WORKINGDIR=%~dp0"
    
    CALL :CreateDirectory "%WORKINGDIR%Logs"
    
    ECHO Wiping files that are %MINDAYSOLD% or more days old...
    ECHO Target Path: "%TARGETPATH%"
    ECHO.
    
    ECHO Searching folder: %TARGETPATH%
    FOR /F "usebackq delims=" %%b IN (
            `forfiles /p "%TARGETPATH%" /S /M *.* /D -%MINDAYSOLD% /C "cmd /C ECHO @path" 2^>nul`
    ) DO (
            SET "filepath=%%~b"
            SET "filename=%%~nxb"
            ECHO   Found !filepath!
            ECHO   Deleting !filename!
            DEL /F /Q /A "!filepath!"
            REM TIMEOUT /NOBREAK /T 1
            IF EXIST "!filepath!" (
                    ECHO   Error deleting file^^!
            ) ELSE (
                    ECHO   Success.
            )
    )
    ECHO   Checking if folder %TARGETPATH% is empty...
    SET "filesearch="
    FOR /F "usebackq delims=" %%c IN (
            `DIR /B /A-D "%%~a" 2^>nul`
    ) DO (
            SET "filesearch=%%c"
    )
    IF {!filesearch!}=={} (
            ECHO   Folder is empty, deleting folder...
            RD /Q "%TARGETPATH%"
            REM TIMEOUT /NOBREAK /T 1
            IF EXIST "%TARGETPATH%" (
                    ECHO   Error deleting folder^^!
            ) ELSE (
                    ECHO   Success.
            )
    ) ELSE (
            ECHO   Folder is NOT empty^^!  Skipping deleting.
    )
    ECHO.
    
    EXIT /B %ERRORLEVEL%
    
    
    REM =================================================================
    REM ! FUNCTIONS                                                     !
    REM =================================================================
    
    REM == Create directory =============================================
    :CreateDirectory
    IF NOT EXIST "%~1" (
            MKDIR "%~1"
    )
    EXIT /B 0
    REM =================================================================
    

    文件夹中有很多文件,我只是想把一天以前的文件返回。由于某些原因,该命令不断返回以下内容。。。

    ...
    ERROR: The parameter is incorrect.
    ERROR: The parameter is incorrect.
    ERROR: The parameter is incorrect.
    ERROR: The parameter is incorrect.
    ERROR: The parameter is incorrect.
    ERROR: The parameter is incorrect.
    ERROR: The parameter is incorrect.
    ERROR: The parameter is incorrect.
    
    test
    test
    ...
    

    我想知道为什么我会犯这些错误。有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Arvo Bowen    6 年前

    我最终想出了以下脚本来解决我的问题。我用FOR循环替换了FORFILES,遍历每个目录,然后在每个目录中使用FORFILES。这样一来,FORFILES就不必在子文件夹中搜索了。下面的脚本遍历每个文件夹(包括子文件夹),然后删除文件,并包含大量详细信息。

    @ECHO OFF
    CLS
    SETLOCAL EnableDelayedExpansion EnableExtensions
    
    SET "MINDAYSOLD=9"
    SET "TARGETPATH=E:\archives"
    
    SET "PADDEDTIME=%TIME: =0%"
    SET "DATESTAMP=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%"
    SET "LOGFILEPATH=Logs\%~n0-%DATESTAMP%.log"
    SET "WORKINGDIR=%~dp0"
    
    CALL :CreateDirectory "%WORKINGDIR%Logs"
    
    ECHO Wiping files that are %MINDAYSOLD% or more days old...
    ECHO Target Path: "%TARGETPATH%"
    ECHO.
    
    FOR /F "usebackq delims=" %%a IN (
        `DIR "%TARGETPATH%" /S /B /AD /O:N`
    ) DO (
        ECHO Searching folder: %%~a
        FOR /F "usebackq delims=" %%b IN (
            `forfiles /p "%%~a" /S /M *.* /D -%MINDAYSOLD% /C "cmd /C ECHO @path" 2^>nul`
        ) DO (
            SET "filepath=%%~b"
            SET "filename=%%~nxb"
            ECHO   Found !filepath!
            ECHO   Deleting !filename!
            DEL /F /Q /A "!filepath!"
            REM TIMEOUT /NOBREAK /T 1
            IF EXIST "!filepath!" (
                ECHO   Error deleting file^^!
            ) ELSE (
                ECHO   Success.
            )
        )
        ECHO   Checking if folder %%~a is empty...
        SET "filesearch="
        FOR /F "usebackq delims=" %%c IN (
            `DIR /B /A-D "%%~a" 2^>nul`
        ) DO (
            SET "filesearch=%%c"
        )
        IF {!filesearch!}=={} (
            ECHO   Folder is empty, deleting folder...
            RD /Q "%%~a"
            REM TIMEOUT /NOBREAK /T 1
            IF EXIST "%%~a" (
                ECHO   Error deleting folder^^!
            ) ELSE (
                ECHO   Success.
            )
        ) ELSE (
            ECHO   Folder is NOT empty^^!  Skipping deleting.
        )
        ECHO.
    )
    
    EXIT /B %ERRORLEVEL%
    
    
    REM =================================================================
    REM ! FUNCTIONS                                                     !
    REM =================================================================
    
    REM == Create directory =============================================
    :CreateDirectory
    IF NOT EXIST "%~1" (
        MKDIR "%~1"
    )
    EXIT /B 0
    REM =================================================================
    
    推荐文章