2016-04-07 3 views
-1

Ich führe Befehl in 1 Stunde-Intervall täglich von einem Drittanbieter-Tool. Ich muss angeben, dass der Befehl zum ersten Mal ausgeführt wird. als ob es das erste Mal ausgeführt wird, muss ich zur Aufgabe 'A' gehen, wenn nicht, dann Aufgabe 'B'Identifizieren Windows-Befehlsausgabe eindeutig für die erste Ausführung

z.B. Befehl:

net start

Ausgänge

erste Ausführungs

[einig Flag da dies zu erkennen ist erster Ausgang]

Test

Nächste Ausführung

Test

so in diesem Fall kann ich in der Lage sein, wenn seine ersten Ausführung oder nicht zu identifizieren.

+0

Ich brauche das in einem einzigen Zeilenbefehl – user2742622

Antwort

0
@ECHO OFF 
SETLOCAL 
:: mainline - test first/not first 

CALL :testfirst ### 
IF DEFINED alreadyrun (ECHO ### already run) ELSE (ECHO ### first run) 
CALL :testfirst $$$ 
IF DEFINED alreadyrun (ECHO $$$ already run) ELSE (ECHO $$$ first run) 
CALL :testfirst ### 
IF DEFINED alreadyrun (ECHO ### already run) ELSE (ECHO ### first run) 
CALL :testfirst $$$ 
IF DEFINED alreadyrun (ECHO $$$ already run) ELSE (ECHO $$$ first run) 

GOTO :eof 


:testfirst 
SET "targetdir=U:\destdir" 
SET "alreadyrun=%date:/=-%" 
IF EXIST "%targetdir%\%alreadyrun%.%1" GOTO :eof 
DEL "%targetdir%\*.%1" 2>NUL >nul 
echo,>"%targetdir%\%alreadyrun%.%1" 
SET "alreadyrun=" 

GOTO :EOF 

Sie müssten die Einstellung targetdir an Ihre Umstände anpassen. U:\destdir passt zu meinem System.

Die Idee hier ist, ein spezielles Verzeichnis einzurichten, in dem relevante Daten gespeichert werden. Ich wählte u:\destdir als das ist bequem für mich. %temp% oder %tmp% kann eine offensichtliche Wahl sein, aber diese können jederzeit willkürlich gelöscht werden, sind also wahrscheinlich nicht die besten.

Der Hauptteil zeigt zwei verschiedene Prozeduren, die "run" genannt ### und $$$ sind - die Namen sind nicht wichtig und können fast alles sein, was Sie möchten. Der kritische Teil ist die :testfirst Subroutine (die ich als interne Unterprogramm geschrieben haben, könnte aber eine unabhängige Batch-Datei, wenn Sie es vorziehen - nur die call :testfirst zu call testfirst ändern)

Diese Routine setzt die Variable alreadyrun auf das aktuelle Datum mit / Zeichen in - als / umgewandelt ist kein gültiger Dateiname.

Dann sehen Sie, ob die Datei (transformiertes Datum).% 1 im ausgewählten Verzeichnis existiert (wobei% 1 durch das angegebene Argument ersetzt wird - ### und $$$ im Beispiel). Wenn dies der Fall ist, beenden Sie einfach die Routine und kehren Sie mit alreadyrun auf einen Wert zurück.

Wenn die Datei nicht existiert, löschen Sie alle Dateien mit der gleichen Erweiterung ### aus dem Verzeichnis (sie wurden gestern oder früher erstellt) und erstellen Sie eine neue (heute). ### Datei. Löschen Sie dann die Umgebungsvariable alreadyrun.

Das aufrufende Routing wird dann alreayrun als undefined (nicht bereits ausgeführt) oder definiert (bereits heute ausgeführt), die Ihre Anforderung erfüllen sollte.