windows - Sådan undgår du at oprette outputfil, hvis der ikke findes nogen filer?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et batch script, der beder om en sti og spørger også for den type filer, jeg vil søge i mapper og undermapper i den pågældende sti. Derefter returneres stien til disse filer i en output.txt-fil.


Her er min kode:


@echo on
set LOGFILE=output.txt
set /P userInputPath=Enter the path you'd like to search?
set /p "FileType=Enter file type(s) here (ex: txt, pdf, docx): "

call :LOG > \%LOGFILE\%
exit
:LOG
for \%\%A in (\%FileType\%) do (dir /b /s \%userInputPath\%*.\%\%A)
@pause


Jeg vil undgå at oprette en output.txt-fil, hvis der ikke findes nogen filer, eller hvis den indtastede sti er forkert. Kan nogen hjælpe mig med det her. Tak skal du have!

Bedste reference


Hvis du bruger en FOR-kommando til at liste filerne, vil den aldrig omdirigere output til logfilen, fordi ekko-kommandoen aldrig udføres, hvis FOR-kommandoen ikke gentager filnavne.


@echo off
set "LOGFILE=output.txt"
del "\%logfile\%"
:LOOP
set /P "userInputPath=Enter the path you'd like to search;"
set /p "FileType=Enter file type(s) here (ex: txt, pdf, docx):"
IF NOT EXIST "\%userInputPath\%" (
    echo \%userInputPath\% does not exist
    GOTO LOOP
)

for /R "\%userInputPath\%" \%\%G in (\%FileType\%) do echo \%\%G>>\%LOGFILE\%
pause

Andre referencer 1


du kan tilføje


for \%\%# in ("\%LOGFILE\%") do (
   if \%\%~z# equ 0 (
       del /s /q "\%LOGFILE\%"
   )
)


i slutningen. Det kontrollerer, om logfilens størrelse er 0, og hvis ja sletter den.

Andre referencer 2


Du kan bruge evnen til for /F kommandoen til at returnere en ExitCode af 1, når der ikke blev behandlet data, det vil sige:


(for /F "delims=" \%\%A in ('dir /b /s "\%userInputPath\%*.\%FileType\%"') do echo \%\%A) > \%LOGFILE\% || rem
if errorlevel 1 del \%LOGFILE\%


Bemærk, at denne kode bruges i stedet for underrutinopkaldet ...


Du kan læse en detaljeret forklaring på, hvordan ExitCode værdien bruges i for /F kommandoen på dette spørgsmål; Se efter Exit Code Management .

Andre referencer 3


Endnu en løsning til at finde filer med skjult filattribut sæt, der ignoreres af kommandoen FOR :


@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LOGFILE=output.txt"
set /P "userInputPath=Enter the path you'd like to search: "
set /P "FileType=Enter file type(s) here (ex: txt, pdf, docx): "

del "\%LOGFILE\%" 2>nul
for \%\%A in (\%FileType\%) do (
    for /F "delims=" \%\%B in ('dir /A-D /B /S "\%userInputPath\%*.\%\%A" 2^>nul') do (
        >>"\%LOGFILE\%" echo \%\%B
    )
)
endlocal


Denne løsning er langsommere, da de andre som den indre FOR læser alle linjer, der udføres med kommandoen DIR , som er næste udgang til at håndtere STDERR omdirigeret til logfil.


Fejlmeddelelsen (e), der udføres med kommandoen DIR , omdirigeres til enheden NUL for at undertrykke dem.


For at forstå de anvendte kommandoer og hvordan de virker, skal du åbne et kommandopromptvindue, udføre de følgende kommandoer, og læs helt alle hjælpesider, der vises for hver kommando, meget omhyggeligt.



  • del /?

  • dir /?

  • echo /?

  • endlocal /?

  • for /?

  • set /?

  • setlocal /?



Se også Microsoft TechNet-artiklen Brug af kommandoredirection-operatører. [16]