batchneuling
Goto Top

For-Schleife Bedingung "nicht erfüllt" abfragen

Hallo zusammen,

dieses Forum hat mir schon des öteren weiter geholfen.
Leider finde ich auch nach intensiver Suche noch nicht das richte für mein Problem.

Ich habe eine kleine Batch:

@echo off &setlocal
set "sourceRoot=Z:\PDF\"
set "sourceList=src.txt"
set "destFolder=Z:\PDF\Neuer Ordner"

for /f "delims=" %%i in ('dir /a-d /b /s "%sourceRoot%\*.pdf"^|findstr /ig:"%sourceList%"') do (
copy "%%~i" "%destFolder%\"
)

Diese funktioniert wie sie soll. Anhand einer Liste "src.txt" werden alle verfügbaren PDF-Dateien in den neuen Ordner kopiert.

Jetzt kann es aber sein das in der Liste .pdf Namen auftauchen, die nicht im Ordner sind.

Gibt es eine Möglichkeit diese direkt auszugeben?

Zur For-Schleife gibt es meines Wissens nur den DO-Befehl (Bedingung erfüllt).
Falls es jetzt ein "DO NOT-Befehl ( Bedingung nicht erfüllt) geben würde, könnte ich recht einfach den nicht existieren Dateinamen ausgeben.

Vielen Dank an alle, die sich Zeit für mein Problem nehmen.

Content-Key: 343298

Url: https://administrator.de/contentid/343298

Printed on: April 19, 2024 at 18:04 o'clock

Mitglied: 133417
133417 Jul 13, 2017 updated at 06:36:17 (UTC)
Goto Top
Schau dir mal die Optionen von findstr an, dort findest du den Switch /V der das macht was du brauchst...
>"notfound.txt" (dir /a-d /b /s "%sourceRoot%\*.pdf" | findstr /ivg:"%sourceList%")  
Gruß
Member: Arano
Arano Jul 13, 2017 at 06:41:34 (UTC)
Goto Top
Guten Morgen.

Mittels IF-Bedingung kann dies im Anweisungsblock des DO geschehen.

for /f "delims=" %%i in ('dir /a-d /b /s "%sourceRoot%\*.pdf"^|findstr /ig:"%sourceList%"') do (   
    IF EXIST "%%~i" (  
        REM COPY "%%~i" "%destFolder%\"  
        ECHO "Okay"  
    ) ELSE (
        ECHO "Nicht gefunden: %%~i"  
    )
)
..oder so *fG*

~Arano
Member: Apophis
Apophis Jul 13, 2017 at 06:42:55 (UTC)
Goto Top
Hallo,

ich hätte ja direkt die Existenz abgefragt:

IF EXIST  "%%~i" GOTO kopieren  
Goto NichtGefunden

:Kopieren
copy "%%~i" "%destFolder%\"   
Goto weiter

:NichtGefunden
Echo "%%~i" >> NichtGefunden.txt  
:Weiter

Optimierungen bleiben Übungsaufgabe...

Gruß
Apophis
Member: BatchNeuling
BatchNeuling Jul 13, 2017 updated at 07:34:34 (UTC)
Goto Top
Vielen Dank für die Antworten.

@133417 Die Lösung muss ich nachher einmal ausprobieren, mit /V liest sich aber so wie ich es haben möchte.

@ Arano, den Gedankengang hatte ich auch, aber hier schreibt er nur "Okay".
In "do" springt er ja erst, wenn die Datei gefunden wurde.

@ Apophos, das hatte ich auch probiert, aber ich glaube ich verschreibe mich in der Syntax.
Könntest du den Schnipsel bitte in meine Schleife als Muster einfügen?

Vielen Dank euch allen
Member: BatchNeuling
BatchNeuling Jul 13, 2017 at 08:10:06 (UTC)
Goto Top
Ich glaube ich stehe gerade etwas auf dem Schlauch.

Ich habe jetzt in den Ordner PDF Datei 2017-0305.pdf erstellt.

In der sourcelist stehen folgende Dateinamen
2017-0305.pdf
2017-0405.pdf

Beim findstr mit "/IVG" erstellt er die Text-Datei aber diese bleibt leer. Hier soll jetzt 2017-0405.pdf stehen.

"notfound.txt" (dir /a-d /b /s "%sourceRoot%\*.pdf" | findstr /ivg:"%sourceList%")

Beim findstr mit "/IG" erstellt er die Text-Datei und schreibt die gefundene 2017-0305.pdf
Member: Friemler
Friemler Jul 13, 2017 updated at 10:46:40 (UTC)
Goto Top
Hallo BatchNeuling,

mit dem Code von @133417 findest Du leider nur die Dateien, die zwar auf der Platte vorhanden sind, in der Textdatei jedoch nicht vorkommen.

In Deinem Eröffnungsposting schreibst Du jedoch

Jetzt kann es aber sein das in der Liste .pdf Namen auftauchen, die nicht im Ordner sind.

Gibt es eine Möglichkeit diese direkt auszugeben?

Du möchtest also die Dateien, deren Namen zwar in der Textdatei vorkommen, auf der Platte jedoch nicht vorhanden sind.

Teste dazu mal folgendes:
@echo off &setlocal

set "SrcFolder=Z:\PDF"  
set "DstFolder=Z:\PDF\Neuer Ordner"  
set "FileMask=*.pdf"  
set "FileList=src.txt"  
set "ProtocolFile=copy.log"  

1>"%ProtocolFile%" 2>NUL (  
  for /f "delims=" %%a in ('dir /s /b /a:-d "%SrcFolder%\%FileMask%" ^| findstr /il /g:"%FileList%"') do (  
    echo %%~nxa
    copy "%%~a" "%DstFolder%" > NUL  
  )
)

findstr /vil /g:"%ProtocolFile%" "%FileList%"  
del "%ProtocolFile%"  

Gruß
Friemler
Member: BatchNeuling
BatchNeuling Jul 13, 2017 at 08:48:58 (UTC)
Goto Top
Hallo Friemler,

in Zeilen 16. und 17. soll die vorhandenen Dateien abgefragt werden, richtig?

Es passiert aber nichts.

Fehlt nicht noch ein echo vom findstr oder eine Umleitung in eine Datei?

Ist es richtig, wenn ich
findstr /vil /g:"%ProtocolFile%" "%FileList%" >test.txt
schreibe, dass er die ganze Suche in die Textdatei schreibt?

Leider muss ich wieder los, kann leider erst Morgen weiter testen.

Vielen Dank vorab.
Member: Friemler
Friemler Jul 13, 2017 at 10:46:26 (UTC)
Goto Top
Hallo BatchNeuling,

  1. FINDSTR gibt die Zeilen der Eingabedatei/der über eine Pipe eingelesenen Eingabe aus, in denen es den/die Suchbegriff(e) findet, ein ECHO ist daher nicht notwendig.
  2. Die von dir skizzierte Umleitung der Ausgabe in eine Datei würde funktionieren.

Ob das Script funktioniert hängt letztendlich davon ab, was in der SRC.txt steht (komplette Pfade oder nur Dateinamen) und ob das Root-Verzeichnis Unterverzeichnisse enthält (in dem Fall enthält die Ausgabe von DIR komplette Pfade, ansonsten nur Dateinamen). Falls die Dateinamen oder deren Pfade z.B. deutsche Sonderzeichen enthalten (äöüßÄÖÜ) spielt auch noch die Zeichencodierung der SRC.txt eine Rolle (OEM 850 wäre bei einem deutschen Windows richtig).

Am besten Du zeigst uns mal einen Auszug aus der SRC.txt und klärst die oben angesprochenen Fragen.

Grüße
Friemler