BATCH (командная строка Windows) - FORFILES, возвращающие «ERROR: параметр неверен». - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть очень простой пакетный сценарий, который пытается использовать команду 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 =================================================================

В папке много файлов, и я просто пытаюсь вернуть файлы за 1 день.По какой-то причине команда продолжает возвращать следующее ...

...
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 Ответ

0 голосов
/ 04 февраля 2019

Я закончил тем, что придумал следующий скрипт, который исправил мою проблему.Я заменил FORFILES на цикл FOR, просматривающий каждый каталог, затем использовал 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 =================================================================
...