windows - Batch-fil til rekursivt scanning for et stykke tid eksistens, og hvis eksisterende tilføjes det til zip altid fejler

Indlæg af Hanne Mølgaard Plasc

Problem



Nedenfor er en batchfil, der accepterer 2 eller flere argumenter. Det



  1. Første argument skal være en basismappe for at søge efter filer (for eksempel D: \ temp)

  2. Andet argument og fortløbende skal være filnavn mønster at søge (for eksempel 2017\_02\_01 eller myapp)



Batchfilen gør følgende



  1. Kontroller, om første argument er tomt og vis passende meddelelse.

  2. Kontrollér, om første argument ikke er eksisterende mappe eller vis passende meddelelse.

  3. Ring til en underrutine for at analysere og gøre noget ved hvert argument.

  4. Kontroller i underrutinen, om uønskede symboler er i argumenter og vis passende meddelelse.

  5. I underrutinen træffer du ikke noget første argument.

  6. Kontroller i underrutinen, om filmønstret argumentet findes i basismappen som det første argument.
    Her fejler tjekket og returnerer altid 1, hvilket er forkert.

  7. Hvis filmønstret argumentet eksisterer, så tag handling som føj filen til en midlertidig zip-fil ved hjælp af 7zip.
    Tilsvarende gør resten af ​​argumenterne.

  8. Hvis argumentet er tom, stop derefter underrutinen.



Nedenfor er batchfilen.


@echo off
set BASE\_DIR=\%1

REM check if first argument is empty and display appropriate message
set NEW\_DIR=\%BASE\_DIR\%X
if \%NEW\_DIR\%==X goto displayUsage

REM check if first argument is not existing directory or display appropriate message
if not exist \%BASE\_DIR\% goto displayUsage
cd /d C:	emp
if exist "C:	emp	emp.zip" del /q /f "C:	emp	emp.zip"
call :subr \%*
exit /b

:subr
rem check if any unwatned symbols are in arguments
if exist "C:	emp	emp.txt" del /q /f "C:	emp	emp.txt"
echo \%* > "C:	emp	emp.txt"
findstr /r ".*[<>/|?*\%\%].*" "C:	emp	emp.txt" >nul
if \%errorlevel\% equ 0 goto displayUsage

rem start parsing each argument
for \%\%A in (\%*) do (
    if not \%\%A==\%BASE\_DIR\% (
        rem check if file exists and take action on it
        pushd \%BASE\_DIR\%
        dir /b /s /a-d *\%\%A* | find "File not found"
        set FILE\_EXISTS=\%errorlevel\%
        rem HERE FILE\_EXISTS STATUS IS ALWAYS 1 IRRESPECTIVE OF FILE PRESENCE
        popd
        if \%FILE\_EXISTS\% equ 0 (
            rem take action on the file like add it to a zip file
            "7za.exe" a -r -y "C:	emp	emp.zip" \%BASE\_DIR\%*\%\%A*.*
        ) else (
            echo File \%\%A does not exists in \%BASE\_DIR\%
        )
    ) else (
        echo No need to parse base directory \%\%A
    )
)
exit /b

:displayUsage
echo Usage: create-logs-zip.bat existing-base-directory log-file-name
echo Do not use symbols: ^< ^> / ? ^| ^*
goto end

:end
if exist "C:	emp	emp.zip" del /q /f "C:	emp	emp.zip"
if exist "C:	emp	emp.txt" del /q /f "C:	emp	emp.txt"
exit /b


Kan nogen pege på, hvad der er fejlen i at kontrollere filen eksisterer og dele, hvorfor den altid vender tilbage 1.


Forespørgsel: Vær venlig at ikke give power shell eller cmdlets eller VB script som alternativer.

Bedste reference


Forsinkelse ekspansion var nødvendig, og variabler skal bruges mellem udråb i stedet for procent. Nedenfor er det uddrag, som fungerede som forventet


for \%\%A in (\%*) do (
    if not \%\%A==\%BASE\_DIR\% (
    PushD "\%BASE\_DIR\%"
    dir /b /s /a-d *\%\%A* 2>null>&2
    set FILE\_EXISTS=!errorlevel!
    PopD
    if !FILE\_EXISTS! equ 0 (\%ZIPTOOL\% a -r -y \%TEMPZIP\% \%BASE\_DIR\%*\%\%A*.*) else (echo File \%\%A is not found)
    ) else (
    echo Skipping compressing of base-directory \%\%A
    )
)