XCOPY und DEL im programm einbinden
Hallo zusammen,
ich hoffe, ihr könnt mir bei dieser Frage weiter helfen
ich habe mir bis jetzt meine batch datei im programm so einbinden lassen
private void beispiel()
{
Process p=null;
try{
p= new Process();
p.StartInfo.FileName = @"C:\\temp\\backup1.bat
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
}
...
Meine Frage: Kann ich den befehl direkt vom programm starten, so brauche ich die datei nicht abzurufen. Für xcopy habe mir an sowas gedacht:
private void beispiel()
{
Process p=null;
try{
string Xcopy = "%SourceDir%//*.* %TargetDir% /E /Y /I /D > C:/temp/backup.log"
p= new Process();
p.StartInfo.FileName = xcopy
p.StartInfo.Arguments = Xcopy;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
}
...
Wie sieht das mit DEL aus?
ich hoffe, ihr könnt mir bei dieser Frage weiter helfen
ich habe mir bis jetzt meine batch datei im programm so einbinden lassen
private void beispiel()
{
Process p=null;
try{
p= new Process();
p.StartInfo.FileName = @"C:\\temp\\backup1.bat
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
}
...
Meine Frage: Kann ich den befehl direkt vom programm starten, so brauche ich die datei nicht abzurufen. Für xcopy habe mir an sowas gedacht:
private void beispiel()
{
Process p=null;
try{
string Xcopy = "%SourceDir%//*.* %TargetDir% /E /Y /I /D > C:/temp/backup.log"
p= new Process();
p.StartInfo.FileName = xcopy
p.StartInfo.Arguments = Xcopy;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
}
...
Wie sieht das mit DEL aus?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 26817
Url: https://administrator.de/forum/xcopy-und-del-im-programm-einbinden-26817.html
Ausgedruckt am: 23.12.2024 um 17:12 Uhr
16 Kommentare
Neuester Kommentar
Moin cinda,
ich denke, XCOPY und DEL musst Du beim Aufruf unterschiedlich behandeln.
Hinter "XCopy" verbirgt sich ja die XCopy.exe... wenn Du Deine Shell/Spawn-Funktion aufrufst, wird diese hoffentlich so intelligent arbeiten, dass sie sinngemäß
- eine "xcopy" im aktuellen Verzeichnis sucht und nicht findet,
- danach eine Xcopy.com, xcopy.exe, xcopy.bat, ... im aktuellen Verzeichnis sucht und nicht findet
- danach eine Xcopy.com, xcopy.exe, xcopy.bat, ... im gesamten definierten %PATH% sucht und dabei die %windir%\system32\XCopy.exe findet und startet:
Bei "DEL" sieht das anders aus... das ist ja ein interner Befehl des CMD-Interpreters, der CMD.exe. Es gibt also nirgendwo eine "DEL.exe", die gefunden werden kann.
Hier sehe ich drei Möglichkeiten:
a) den internen CMD-Befehl "Del" als Parameter übergeben an die CMD.exe
Aufruf "cmd /c del [pfad\][Dateiname] [parameter]"
b) das Löschen mit C-Funktionen machen - ohne CMD.exe und ohne DEL
(wie immer die Funktionen bei Deinem C-Compiler heißen: FileDelete() oder FErase()..etc )
c) die bisherige Strategie beibehalten und einen Batch aufrufen...
Schönes Wochenende
Biber
ich denke, XCOPY und DEL musst Du beim Aufruf unterschiedlich behandeln.
Hinter "XCopy" verbirgt sich ja die XCopy.exe... wenn Du Deine Shell/Spawn-Funktion aufrufst, wird diese hoffentlich so intelligent arbeiten, dass sie sinngemäß
- eine "xcopy" im aktuellen Verzeichnis sucht und nicht findet,
- danach eine Xcopy.com, xcopy.exe, xcopy.bat, ... im aktuellen Verzeichnis sucht und nicht findet
- danach eine Xcopy.com, xcopy.exe, xcopy.bat, ... im gesamten definierten %PATH% sucht und dabei die %windir%\system32\XCopy.exe findet und startet:
Bei "DEL" sieht das anders aus... das ist ja ein interner Befehl des CMD-Interpreters, der CMD.exe. Es gibt also nirgendwo eine "DEL.exe", die gefunden werden kann.
Hier sehe ich drei Möglichkeiten:
a) den internen CMD-Befehl "Del" als Parameter übergeben an die CMD.exe
Aufruf "cmd /c del [pfad\][Dateiname] [parameter]"
b) das Löschen mit C-Funktionen machen - ohne CMD.exe und ohne DEL
(wie immer die Funktionen bei Deinem C-Compiler heißen: FileDelete() oder FErase()..etc )
c) die bisherige Strategie beibehalten und einen Batch aufrufen...
Schönes Wochenende
Biber
Hm, cinda,
ich meinte es so:
die XCopy-Zeile im "alten" Batch könntest Du so aufrufen wie oben beschrieben.
Evtl etwas anpassen in der programmzeile:
p.StartInfo.FileName = xcopy ---> p.StartInfo.FileName = "xcopy.exe"
Bei der 2. "alten Batchzeile" geht das nicht.
Die müsstest Du wieder als neunen Prozeß definieren.
Und dann:
...
...
p.StartInfo.FileName = "Cmd.exe"
p.StartInfo.Arguments = " /c DEL filename.exe";
So meinte ich das.
Gruß Biber
P.S. Klappt übrigens jetzt die Zeitmessung im anderen Thread?
ich meinte es so:
die XCopy-Zeile im "alten" Batch könntest Du so aufrufen wie oben beschrieben.
Evtl etwas anpassen in der programmzeile:
p.StartInfo.FileName = xcopy ---> p.StartInfo.FileName = "xcopy.exe"
Bei der 2. "alten Batchzeile" geht das nicht.
Die müsstest Du wieder als neunen Prozeß definieren.
Und dann:
...
...
p.StartInfo.FileName = "Cmd.exe"
p.StartInfo.Arguments = " /c DEL filename.exe";
So meinte ich das.
Gruß Biber
P.S. Klappt übrigens jetzt die Zeitmessung im anderen Thread?
Mit der Zeitmessung klappt wunderbar im batch, danke!
Ich glaube, ich kann sie nicht mehr anwenden,
wenn ich xcopy direkt vom programm
abrufe oder?!
Ich glaube, ich kann sie nicht mehr anwenden,
wenn ich xcopy direkt vom programm
abrufe oder?!
Wenn Du die Zeitmessung nicht über einen Batch machst, müsstest Du die Zeit in Deinem C-Programm messen.
Und eigentlich würde ich auch diesen ganzen Block ( Xcopy, DEL und aktualisieren der Logdatei) von einem Batch machen lassen. Inhaltlich gehört es zusammen - ist aus Sicht Deines Programms eine black box. Wenn Du die StartZeit/EndeZeit in Deinem C-Programm ermittelst UND in dasselbe Logfile schreibst, in das auch die XCopy-Fehlermeldungen umgeleitet werden, ist es zwar von der Anzahl der Zeilen kein Mehraufwand... Du kannst also
- StartZeit/EndeZeit/Differnz in C ermitteln
- Xcopy.exe in C via "new Process()" aufrufen
- zum Löschen entweder über "new Process()"/ CMD.exe DEL .." ODER über C-Funktionen gehen
und so den Batch "einsparen" (nur die XCopy.exe aufrufen).
Aber was soll es - Du rufst so oder so einen "Fremdprozess" auf, weil es Unsinn wäre, den Xcopy noch mal neu zu programmieren. Und dann kann dieser "Fremdprozess", dieses externe programm auch ruhig ein Batch sein... dann lässt der sich später mal komplett anpassen oder austauschen, ohne dass Du Dein C-Programm ändern oder neu kompilieren musst.
Selbst wenn der Batch mal aus irgendwelchen Gründen später mal gar nicht mehr benötigt werden sollte... dann kannst Du diesen batch einfach als Datei mit dem bisherigen Namen und 0 Byte Inhalt oder mit einer Zeile "REM Dieser Batch wird nicht mehr benötigt" stehen lassen.. an Deinem C-Programm musst Du nichts mehr ändern.
Grüße zurück
Frank / der Biber aus Bremen
P.S. Deinen anderen Beitrag schließe ich dann mal.
Hallo cinda,
hab Dich schon richtig vermisst
Du hast aber auch Pech - entweder fragst Du mich grad etwas, wenn Werder Bremen spielt oder wenn ich "8 Mile" anschaue..
Deshalb habe ich jetzt auch nur während der Werbepause Zeit, und teste das mal nicht in meinem Dev-C++-Compiler.
Aber:
zu 1)
Ja, Du hast recht.. rufe da einen Batch auf... andernfalls kannst nicht so ("%quelle%) auf die CMD-Environment-Variablen zugreifen.
Die musst Du schon mit Environ("quelle") oder wie immer es in Deinem Compiler heißt, vorher ermitteln/auflösen.
zu 2)
p.StartInfo.FileName =cmd.exe
... solltest Du ergänzen. Das wird die ShellExec()-Funktion bzw. das Process()-Object nicht auf die Reihe bekommen, wenn keine ausführende Executable angegeben wird und die Aufrufzeile mit "/c DEL" anfängt..
uuups....sorry, melde mich nach der Werbepause wieder...
Grüße Biber
hab Dich schon richtig vermisst
Du hast aber auch Pech - entweder fragst Du mich grad etwas, wenn Werder Bremen spielt oder wenn ich "8 Mile" anschaue..
Deshalb habe ich jetzt auch nur während der Werbepause Zeit, und teste das mal nicht in meinem Dev-C++-Compiler.
Aber:
zu 1)
Ja, Du hast recht.. rufe da einen Batch auf... andernfalls kannst nicht so ("%quelle%) auf die CMD-Environment-Variablen zugreifen.
Die musst Du schon mit Environ("quelle") oder wie immer es in Deinem Compiler heißt, vorher ermitteln/auflösen.
zu 2)
p.StartInfo.FileName =cmd.exe
... solltest Du ergänzen. Das wird die ShellExec()-Funktion bzw. das Process()-Object nicht auf die Reihe bekommen, wenn keine ausführende Executable angegeben wird und die Aufrufzeile mit "/c DEL" anfängt..
uuups....sorry, melde mich nach der Werbepause wieder...
Grüße Biber
Na gut, cinda,
ich versuche, weniger chinesisch zu schreiben, oder zumindest langsamer...
Also, wie weiter oben schon angedeutet: ich würde diese gesamte Xcopy/Del-Teilaufgabe von einem Batch machen lassen lassen.
Begründung:
a) es ist sinnvoller, die XCopy-Funktionalität zu nutzen alsdiese selber nachzuprogrammieren
b) das ganze ist aus Sicht Deines Programms EINE externe Funktion - entweder void oder mit EINEM Rückgabewert.
c) statt eines Batches mit zwei/drei Zeilen mit XCopy und Del könnte ebenso (siehe ganz oben) ein Robocopy /MIR-Aufruf stehen
d) es wäre unsinnig, das Dateien kopieren von Xcopy.exe ausführen zu lassen und davon unabhängig das Löschen einem neuen Prozess.
Mit der Strategie, die Du gewählt hast (new Process()) habe ich so etwas noch nicht probiert.
Mein Standartvorgehen dafür ist:
--------snipp cindaCallsXCopyDelBatch.cpp
#include <windows.h>
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
int main ()
{
ShellExecute(NULL, "open", "z:\\Batches\\XCopyDel.bat", NULL, NULL, SW_HIDE) ;
return 0;
}
--------snipp cindaCallsXCopyDelBatch.cpp
...das heißt, wenn ich aus einem C#-Programm heraus eine Teilaufgabe an einen Batch delegiere, verzichte ich sogar auf Auswertung eines Errorlevels/eines Rückgabewerts. Denn der Batch sollte schon so programmiert sein, dass er eventuelle Fehler in eine Logdatei schreibt.
Und für Dein C#Programm macht es keinen Unterschied, ob das Sichern Erfolg hatte oder nicht... entweder es wurde gesichert UND gelöscht oder WEDER gesichert NOCH gelöscht... also brauchst Du keine Fehlerbehandlung machen. Und in eine Logdatei brauchst Du auch nichts schreiben - ist auch schon getan.
Also lass diese Teilaufgabe den Batch machen...komplett.
"Alle unter einem Himmel", um Jet Lee zu zitieren...
Angenehmen Wochenbeginn
Biber
ich versuche, weniger chinesisch zu schreiben, oder zumindest langsamer...
Also, wie weiter oben schon angedeutet: ich würde diese gesamte Xcopy/Del-Teilaufgabe von einem Batch machen lassen lassen.
Begründung:
a) es ist sinnvoller, die XCopy-Funktionalität zu nutzen alsdiese selber nachzuprogrammieren
b) das ganze ist aus Sicht Deines Programms EINE externe Funktion - entweder void oder mit EINEM Rückgabewert.
c) statt eines Batches mit zwei/drei Zeilen mit XCopy und Del könnte ebenso (siehe ganz oben) ein Robocopy /MIR-Aufruf stehen
d) es wäre unsinnig, das Dateien kopieren von Xcopy.exe ausführen zu lassen und davon unabhängig das Löschen einem neuen Prozess.
Mit der Strategie, die Du gewählt hast (new Process()) habe ich so etwas noch nicht probiert.
Mein Standartvorgehen dafür ist:
--------snipp cindaCallsXCopyDelBatch.cpp
#include <windows.h>
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
int main ()
{
ShellExecute(NULL, "open", "z:\\Batches\\XCopyDel.bat", NULL, NULL, SW_HIDE) ;
return 0;
}
--------snipp cindaCallsXCopyDelBatch.cpp
...das heißt, wenn ich aus einem C#-Programm heraus eine Teilaufgabe an einen Batch delegiere, verzichte ich sogar auf Auswertung eines Errorlevels/eines Rückgabewerts. Denn der Batch sollte schon so programmiert sein, dass er eventuelle Fehler in eine Logdatei schreibt.
Und für Dein C#Programm macht es keinen Unterschied, ob das Sichern Erfolg hatte oder nicht... entweder es wurde gesichert UND gelöscht oder WEDER gesichert NOCH gelöscht... also brauchst Du keine Fehlerbehandlung machen. Und in eine Logdatei brauchst Du auch nichts schreiben - ist auch schon getan.
Also lass diese Teilaufgabe den Batch machen...komplett.
"Alle unter einem Himmel", um Jet Lee zu zitieren...
Angenehmen Wochenbeginn
Biber