1.9k Aufrufe
Gefragt in Windows 7 von
Hallo,

ich nutze abundzu .cmd Dateien um Jobs auf meinem Rechner ausführen zu lassen. Z. B. starte ich über die Aufgabenplanung manchmal .cmd's die z. B. enthalten dass Acronis gestartet wird und ein Image erstellt wird etc.

Manchmal hänge ich auch mehrere Aktionen mit timout nacheinander, dass könnte dann so ausssehen:

1. SymantecSystemscan
2. timeout 1,5h (Damit Symantec auch fertig ist)
3. Acronis Image und dann Rechner rungerfahren

Jetzt würde mich interessieren, ob es auch geht, dass die Kommandozeile eine Rückmeldung bekommt, dass z. B. Symantec fertig ist und dann Acronis startet... Für viele Aufgaben ist es sehr unbequem mit starren Zeitangaben dafür zu sorgen, dass ein Job erst startet wenn der andere fertig ist.

Ideen? Ratschläge?

Ach ja: Win7 64bit nutze den Rechner zu Hause kein Netzwerk o. Ä.

7 Antworten

0 Punkte
Beantwortet von
du könntest beispielsweise ein Programm über start /wait aus der batch aufrufen. Dann läuft die Batch erst weiter, wenn die aufgerufenen exe beendet wird

zum Bleistift:
start /wait c:\Windows\notepad.exe
0 Punkte
Beantwortet von
Hi,

das klingt interessant aber das bedeutet, dass sich das aufgerufene Programm selbst beenden muss. Richtig?

Also wenn ich einen Scanjob mit Norton starte hätte ich dann das Problem, dass sich Norton nach dem Job nicht selbst beendet. Gibt es dafür eine Lösung?
0 Punkte
Beantwortet von mixmax Experte (2.2k Punkte)
kannst du vielleicht am erstellungsdatum eines Ordners oder einer Logdatei oder so feststellen ob das Backup fertig ist?

oder du ließt im 1 minutentakt die größe einer Logdatei (ich denke mal das es eine gibt) und wenn die länger als 2 minuten nicht größer geworden ist weißst du es ist fertig...

ich programmiere in c#, wenn du BAT/CMDdateien schreiben kannst, dann ist es auch nicht so weit sich eine kleine konsolenanwendung zu schreiben die du in der CMDdatei benutzen kannst...

z.B. eine Exe schreiben die man so aufruft:
start /wait WarteKeineÄnderung.exe "C:\Windows\SymantecLog.log" 60 120

und die exe ließt dann was aus wo es dran erkennt ob symantec fertig ist und beendet sich dann...

Suche am besten mal nach Logfiles oder so..

oder man kann den Scan vielleicht doch per BAT auch so starten das er wartet?
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Ich hätte da eine Idee die noch konkret ausgearbeitet werden müsste…
Batch ist kein Rechenkünstler, aber ich sehe da eine Chance aus der Ist-Zeit Stunden und Minuten zu ermitteln, die entsprechend zu addieren und in einen String zu verwandeln er wiederum gegen die Ist-Zeit geprüft werden kann.
Ob diese CMD-Box mit so einer Warteschleife aber nicht zum Ressourcenfresser (und damit zum Spielverderber) wird weiß ich nicht zu sagen

Eric March.
0 Punkte
Beantwortet von mixmax Experte (2.2k Punkte)
vorher wollte ich ja eigentlich wissen ob es eine bekannte Logdatei gibt...

also mal in der annahme das hier die Lösung in 20 minuten basteln in C# und sicher kein Recourcenfresser:


Als Verweiss kann man alle rausnehmen außer "System"

using System;
using System.Reflection;
using System.IO;

namespace waitnochangeexit
{
class Program
{
/// <summary>
/// Erstellt von René Wißmann
/// für Supportnet.de https://supportnet.de/t/2402502
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{

if (args.Length == 3 && File.Exists(args[0]) && Convert.ToInt32(args[1]) >
0 && Convert.ToInt32(args[2]) > Convert.ToInt32(args[1]))
{
DateTime nextwait = DateTime.Now.AddSeconds(Convert.ToInt32(args[1]));
bool Cont = true;
long lastsize = 0;
while (Cont)
{
if (DateTime.Now > nextwait)
{
FileInfo FileState = new FileInfo(args[0]);
if (DateTime.Now > FileState.LastWriteTime.AddSeconds(Convert.
ToInt32(args[2])) && lastsize == FileState.Length)
Cont = false;
Console.Out.Write("\rJetzt: " + nextwait.ToLongTimeString() +
" Datei von: " + FileState.LastWriteTime.ToLongTimeString(
) + " Bytes: " + FileState.Length);
nextwait = DateTime.Now.AddSeconds(Convert.ToInt32(args[1]));
lastsize = FileState.Length;
}
System.Threading.Thread.Sleep(100);
}
}
else
{
string ProgName = new FileInfo(Assembly.GetExecutingAssembly().
Location).Name;
Console.Out.WriteLine("");
Console.Out.WriteLine("");
Console.Out.WriteLine("");
Console.Out.WriteLine("verwendung:");
Console.Out.WriteLine(ProgName + " Dateiname Testinverval" +
" Exitwait");
Console.Out.WriteLine("");
Console.Out.WriteLine("Dateiname: Pfad und Dateiname (in \"" +
") zur prüfenden Datei");
Console.Out.WriteLine("Testinverval (Sekunden): Wie oft soll" +
" nach der datei geschaut werden?");
Console.Out.WriteLine("Exitwait (Sekunden): Programm beenden" +
" wenn Datei so lange gleich.");
Console.Out.WriteLine("");
Console.Out.WriteLine("Beispiel:");
Console.Out.WriteLine(ProgName + " \"C:\\LogFiles\\Test.log\" 1 120");
Console.Out.WriteLine("");
}
}
}
}
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
'm'm. Und mit was kompiliert der TO dies?
0 Punkte
Beantwortet von mixmax Experte (2.2k Punkte)
www.microsoft.com/germany/express/products/windows.aspx

ich möchte mal keine exe verlinken. C# Express ist für engagierte Hobbybastler ein Segen (die EXPRESS Produkte sind kostenfrei).

relativ leicht zu verstehen, einfach eine Neue Konsolenanwendung erstellen mit dem Namen "waitnochangeexit" (Achtung ich vergesse immer den NAmen zu ändern bevor ich auf OK klicke) den PRogrammcode einfügen und einmal Veröffentlichen..

Rechts am Rand gibts den Projektmappenexplorer, da drinen in dem Ordner Verweise können alle Verweise außer der Verweiß "System" gelöscht werden.

einmal speichern, dann auf Eigenschaften, das Startobjekt auf "waitnochangeexit.Program" einstellen, Du kannst das ZielFramework ändern (z.B. auf 2.0 wenn das Programm auch unter Windows 2000 laufen soll.)

Dann einmal auf Projekt > veröffentlichen - wenn er dir eine Datei mit .exe.deploy erstellt, einfach das .deploy wegbenennen.
...