chappy
Goto Top

Finde Datei von heute die xxx als Zeichenkette beinhaltet

Hallo Zusammen,

bin wieder an meinen Versuchen eine batch aufzusetzen ins stolpern geraten und hoffe mir von euch Hilfen.

Das ganze soll wie folgt aussehen:

1. prüfe, ob Anwendung.exe läuft
a) JA, dann echo "Anwendung läuft"
b) NEIN, dann prüfe, ob datei.csv vorhanden ist
a) JA, dann echo "Prozess erfolgreich beendet"
b) NEIN, dann starte Anwendung.exe
2. beende Anwendung.exe um 23:59Uhr

So, meine ersten Versuche sehen wie folgt aus:

@echo off

set "Pfad=C:\Test\"  
  
tasklist |findstr "Anwendung\.exe" >nul   
if %errorlevel% == 0 (
 echo Das Programm leauft gerade!
 ) else (
  echo Das Programm leauft gerade nicht! 
  
 ??????????  

 )
irgenntwie bekomme ich das nicht hin. Ich suche eine Datei, die eine bestimmte Zeichenfolge beinhaltet und das heutige Datum hat. Wie kann ich das innerhalb der else-Bedingung formulieren?

  else if exist ( 'dir "%Pfad%"^|findstr /m "\<%date%*_File_Test_Name.csv" '  ) (  
  echo Der Prozess ist erfolgreich abgeschlossen
  ) else (
  Anwendung.exe

Damit bekomme ich auch nicht die richtige Datei, warum nicht?
Weiterhin, wie kann ich die .exe mit der bat starten?

Gruss und Dank
chappy

Content-ID: 153525

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

bastla
bastla 21.10.2010 um 13:00:24 Uhr
Goto Top
Hallo chappy!

Heißt die .csv immer "File_Test_Name.csv"? Wenn ja ungetestet etwa so:
) else (
    for %%i in ("%Pfad%File_Test_Name.csv") do echo %%~ti|findstr "%date:.=\.%">nul && (  
        findstr "Suchbegriff" "%Pfad%File_Test_Name.csv">nul && (echo Der Prozess ist erfolgreich abgeschlossen & goto :Weiter)  
    )
    Anwendung.exe
)
:Weiter
Falls nein:
) else (
    set "Gef="  
    for /f "delims=" %%i in ('findstr /m "Suchbegriff" "%Pfad%*.csv"') do if not defined Gef echo %%~ti|findstr "%date:.=\.%">nul && (echo Der Prozess ist erfolgreich abgeschlossen & set "Gef=True")  
    if not defined Gef Anwendung.exe
)
Zur Sicherheit solltest du kontrollieren, ob das Format von "%date%" mit (dem Beginn von) "%%~ti" übereinstimmt ...
Zu
2. beende Anwendung.exe um 23:59Uhr
Geplanter Task mit "taskkill"

Grüße
bastla
chappy
chappy 21.10.2010 um 14:01:31 Uhr
Goto Top
Hallo Bastla,

erst einmal herzlichen Dank für deine rasche Antwort.

leider funktioniert es nicht wirklich. Die gesuchte Datei sieht folgendermaßen aus:

JJJJMMTT_HHMM_Bezeichnung!_Bezeichnung2.csv

dabei ist JJJJMMTT das heutige Datum und die Uhrzeit entspricht auch der Erstellungsuhrzeit.

Gruss
chappy
bastla
bastla 21.10.2010 um 15:02:06 Uhr
Goto Top
Hallo chappy!
das heutige Datum hat
hatte ich mit "Änderungsdatum" übersetzt ...

... wobei sich die Suche nach dem Dateinamen aber noch einfacher gestalten sollte:
) else (
    set "Gef="  
    for /f "delims=" %%i in ('findstr /m "Suchbegriff" "%Pfad%%date:~-4%%date:~-7,2%%date:~-10,2%_*_Bezeichnung!_Bezeichnung2.csv"') do && if not defined Gef (echo Der Prozess ist erfolgreich abgeschlossen & set "Gef=True")  
    if not defined Gef Anwendung.exe
)
Grüße
bastla

P.S.: Bleibt noch die Frage offen, welches Ergebnis "echo %date%" bei Dir liefert - für "21.10.2010" (auch mit Wochentagsangabe davor) sollte das klappen ...
Friemler
Friemler 21.10.2010 um 16:48:53 Uhr
Goto Top
Hallo chappy,

hier mein Vorschlag zu Lösung des Problems.
@echo off

setlocal


set "FilePath=E:"  
set "String1=String1"  
set "String2=String2"  

set "SearchStr=Ein Begriff"  

set "ProgPath=C:\Programme\Beispiel"  
set "ProgName=Anwendung.exe"  


for /f "tokens=1-4 delims=. " %%p in ('echo %date%') do (  
  echo %%p|findstr "[^0-9]" > NUL && (  
    set "dd=%%q"  
    set "mm=%%r"  
    set "yy=%%s"  
  ) || (
    set "dd=%%p"  
    set "mm=%%q"  
    set "yy=%%r"  
  )
)

set "FileMask=%yy%%mm%%dd%_????_%String1%_%String2%.csv"  

tasklist | findstr /b /i "%ProgName:.=\.%" > NUL && (  
  echo Das Programm leauft gerade!
) || (
  echo Das Programm leauft gerade nicht!

  if exist "%FilePath%\%FileMask%" (  
    call :ProcessFile && (
      echo "Prozess erfolgreich beendet"  
    ) || (
      "%ProgPath%\%ProgName%"  
    )
  ) else (
    "%ProgPath%\%ProgName%"  
  )
)

endlocal
exit /b



:ProcessFile
  for %%f in ("%FilePath%\%FileMask%") do (  
    for /f "usebackq tokens=1-6 delims=:. " %%p in ('%%~tf') do (  
      echo %%p|findstr "[^0-9]" > NUL && (  
        findstr /c:"%SearchStr%" "%FilePath%\%yy%%mm%%dd%_%%t%%u_%String1%_%String2%.csv" > NUL && exit /b 0  
      ) || (
        findstr /c:"%SearchStr%" "%FilePath%\%yy%%mm%%dd%_%%s%%t_%String1%_%String2%.csv" > NUL && exit /b 0  
      )
    )
  )
exit /b 1

Ich habe hier versucht, das Skript so zu schreiben, das das Datumsformat des Systems (fast) egal ist. Was nicht klappt, wäre ein Datumsformat wie So., 24.10.2010, da hier der Punkt hinter So stören würde, oder ein englisches Datumsformat wie MM.DD.YYYY oder das amerikanische YYYY.MM.DD oder ein anderes Datumstrennzeichen als der Punkt. Das würde Anpassungen erfordern.

Die Variablen String1 und String2 müssen mit dem anscheinend festen Bestandteil des Dateinamens belegt werden, die Du in Deinem Posting als Bezeichnung1 und Bezeichnung2 benannt hast.

In der FOR-Schleife in den Zeilen 16 bis 26 wird das aktuelle Datum in seine Bestandteile zerpflückt. Der Punkt und Leerzeichen zählen als Trennzeichen (Datumstrennzeichen). Wenn vor den Zahlen des Datums noch nicht-numerische Zeichen (z.B. Sonntag, ) stehen (der FINDSTR-Befehl in Zeile 17 findet diese), wird die Zerlegung anders ausgeführt, als bei einem puren Datum ohne Wochentag. Aus diesen Angaben wird in Zeile 28 eine Dateimaske zusammengebaut.

Zeile 30 sucht nach dem gewünschten Programm.

In Zeile 35 wir mit IF EXIST nach Dateien, die auf die eben generierte Dateimaske passen, gesucht. Wenn eine oder mehrere solche Dateien existieren, wird das Unterprogramm ProcessFile aufgerufen.

Die FOR-Schleife in Zeile 52 findet alle Dateien, auf die die Dateimaske passt. Die FOR-Schleife in Zeile 53 liefert den Zeitstempel aller dieser Dateien, der in seine Bestandteile zerlegt wird. Trennzeichen sind Punkt, Doppelpunkt und Leerzeichen (Datumstrennzeichen und Uhrzeittrennzeichen). In Zeile 54 wird wieder nach nicht-numerischen Zeichen vor den Zahlen des Datums gesucht. Je nachdem, zu welchem Ergebnis diese Suche geführt hat, wird in den Zeilen 55 und 57 der Dateiname der Datei, die nach dem Suchbegriff durchsucht werden soll, zusammengebaut und die Datei durchsucht. Wird der Begriff gefunden, wird das Unterprogramm mit dem Rückgabewert 0 beendet. Wird in keiner der durchsuchten Dateien der Begriff gefunden oder wenn keine Dateien gefunden wurden, auf die die Dateimaske passt, wird mit dem Rückgabewert 1 beendet.

Je nach Rückgabewert wird dann in Zeile 37 eine Erfolgsmeldung ausgegeben oder in Zeile 39 die gewünschte Anwendung gestartet. Wenn vorher schon keine Dateien gefunden wurden, auf die die Dateimaske passt, wird die Anwendung in Zeile 42 ebenfalls gestartet.

Da ich das Skript nicht vollständig getestet habe, poste ich es erstmal so ohne einen Monitor, der die Anwendung zu einer bestimmten Zeit beendet, kann ich ja noch nachliefern.

Gruß
Friemler
bastla
bastla 21.10.2010, aktualisiert am 18.10.2012 um 18:43:51 Uhr
Goto Top
Hallo Friemler!

Wir wir ja erst neulich feststellen konnten gibt es hinsichtlich Datumsformat ja fast nichts, was es nicht gibt face-wink - insofern wären wir auch hier eigentlich nur mit einer anderen Sprache (meine wäre weiterhin VBS) auf der sicheren Seite ...

Grüße
bastla
Friemler
Friemler 21.10.2010 um 17:10:59 Uhr
Goto Top
Hallo bastla,

hast ja recht, war ja auch nur ein Versuch, wenigstens die zwei meistgebrauchten Formate TT.MM.JJJJ und TTTT, TT.MM.JJJJ unter einen Hut zu bringen.

Gruß
Friemler
bastla
bastla 21.10.2010 um 17:15:53 Uhr
Goto Top
Hallo Friemler!
die zwei meistgebrauchten Formate TT.MM.JJJJ und TTTT, TT.MM.JJJJ unter einen Hut zu bringen.
Dazu genügt aber eigentlich das oben verwendete
%date:~-4%%date:~-7,2%%date:~-10,2%
Grüße
bastla
60730
60730 21.10.2010, aktualisiert am 18.10.2012 um 18:43:51 Uhr
Goto Top
Salü,
Zitat von @bastla:
Hallo Friemler!

Wir wir ja erst neulich feststellen konnten gibt es hinsichtlich
Datumsformat ja fast nichts, was es nicht gibt face-wink

*Hüstel* - gestern hab ich auch die Reg in meinem Schnippsel Ordner gefunden, die "das" angestellt hat face-wink
"Sowas" passiert halt, wenn man mal testet face-wink

Apropos testen und Versuchen face-wink

Eigentlich dürfte es bei diesem fieskrummen und wahrscheinlich viel zu aufwändigemWeg kein Pfad nach Rom unpassierbar sein?

:testballon

if exist test.test del test.test
echo test>test.test
dir test.test |find "test.test">test.test  
for /f "tokens=1-3 delims=. " %%a in (test.test) do dir %%c.%%b.%%a_????_*!_*.csv |find "%%a.%%b.%%c" && echo krummeralskrumm  
del test.test


Gruß
Friemler
Friemler 22.10.2010 um 02:06:22 Uhr
Goto Top
Hallo bastla,

stimmt, ist auf jeden Fall kürzer und kommt ohne Fallunterscheidungen aus. Da hab' ich zu kompliziert gedacht.

Gruß
Friemler
Friemler
Friemler 22.10.2010 um 02:54:01 Uhr
Goto Top
Hallo Timo,

echt abgefahren, Deine Idee mit der Dummy-Datei! Würde aber nur für das Datumsformat TT.MM.JJJJ funktionieren. Beim Datumsformat TTTT, TT.MM.JJJJ wird im Dateilisting von DIR der abgekürzte Wochentag vor dem Datum ausgegeben, dahinter ein Komma und ein Leerzeichen. In der FOR-Schleife hätte also %%a heute den Wert "Fr," , %%b den Wert "22" und %%c den Wert "10" => Dateimaske wird falsch zusammengebaut face-sad . Je nach Datumsformat werden also 3 oder 4 Tokens gebraucht.

Beim englischen oder amerikanischen Datumsformat stimmt die Anordnung von Tag, Monat und Jahr nicht (ich weiß, war bei meinem Skript auch so).

Ich vermute aber, das es Dir eher um eine kürzere Methode zum Auflisten aller Dateien vom heutigen Tag ging, die auf das vom TO vorgegebene Muster passen. Um deren Namen weiter verarbeiten zu können, müsste erst noch das Datum, die Uhrzeit und die Größe aus der Ausgabe gefiltert werden. Auch hier ist die Anzahl der Tokens vom Datumsformat abhängig.

Aber ansonsten gefällt mir Deine Idee, vor allem weil man Bezeichnung1 und Bezeichnung2 nicht kennen muss

Gruß
Friemler
chappy
chappy 25.10.2010 um 14:12:30 Uhr
Goto Top
Hallo zusammen,

erst einmal herzlichen Dank für eure Antworten.

@bastla: wenn ich deinen Code ausführe, bekomme ich die Meldung: ""&&" ist syntaktisch an dieser Stelle nicht verarbeitbar." - warum?
weiterhin: kommt an die Stelle Suchbegriff mein Suchbegriff rein? ja, ne?

Gruss und Dank
chappy
bastla
bastla 25.10.2010 um 14:58:49 Uhr
Goto Top
Hallo chappy!
bekomme ich die Meldung: ""&&" ist syntaktisch an dieser Stelle nicht verarbeitbar." - warum?
Relativ einfach zu erklären: Weil "&&" an dieser Stelle syntaktisch nicht verarbeitbar (bzw hier sowieso überflüssig) ist face-wink - war ein Überbleibsel der vorigen Version, daher bitte ersatzlos streichen und: Sorry wegen der Irritation ...
kommt an die Stelle Suchbegriff mein Suchbegriff rein? ja, ne?
Hätte eigentlich eine Überraschung werden sollen, aber jetzt hast Du's schon erraten ... face-wink

Grüße
bastla