cinda
Goto Top

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?

Content-Key: 26817

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

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

Member: Biber
Biber Feb 24, 2006 at 13:34:04 (UTC)
Goto Top
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
Member: cinda
cinda Feb 24, 2006 at 14:03:16 (UTC)
Goto Top
Hallo Biber,

wenn ich dich richtig verstehe, dann kann ich mit dieser art nur das problem für xcopy lösen und mein codenabschnitt sieht so einfach aus:

private void Copy()
{
Process p=null;
try{
p= new Process();
p.StartInfo.FileName = xcopy
p.StartInfo.UseShellExecute = true;
p.StartInfo.CreateNoWindow = true;
p.Star
p.Start();
p.WaitForExit();
}
...
Natürlich muß ich meine datei xcopy.bat im projetverzeichnis speichern oder??

Viel Grüße und schönes wochenende
Member: Biber
Biber Feb 24, 2006 at 14:13:06 (UTC)
Goto Top
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?
Member: cinda
cinda Feb 24, 2006 at 14:22:46 (UTC)
Goto Top
Geht klar, habe verstanden.
Mit der Zeitmessung klappt wunderbar im batch, danke!
Ich glaube, ich kann sie nicht mehr anwenden, wenn ich xcopy direkt vom programm abrufe oder?!

viel Grüße
cinda
Member: Biber
Biber Feb 24, 2006 at 16:38:57 (UTC)
Goto Top
Mit der Zeitmessung klappt wunderbar im batch, danke!
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.
Member: cinda
cinda Feb 26, 2006 at 19:01:22 (UTC)
Goto Top
Hallo Biber:

ich wollte kurz meine beiden codenabschnitte (in c#) posten, da es keiner von denen funktionniert, vielleicht stimmt mit der syntax nicht:

private void Copyfiles()
{
Process p=null;
try
{
string xcopy = "%Ziel%\\*.* %Quelle% /E /Y /I /D";
p= new Process();
p.StartInfo.FileName = "xcopy.exe";
p.StartInfo.CreateNoWindow = false;
p.StartInfo.UseShellExecute = true;
p.Start();
p.WaitForExit();
}
catch {

}
}

PS: Auf dieser zeile kann ich ja verzichten: string xcopy = "%Ziel%\\*.* %Quelle% /E /Y /I /D", wenn ich die batch datei im verzeichnisprojekt speichere.

2.
private void Deletfiles()
{
Process p=null;
try
{

p= new Process();
p.StartInfo.Arguments = " /c DEL C:\\image\\bilder\\bilder1\\bild.jpg.exe";
p.StartInfo.CreateNoWindow = false;
p.StartInfo.UseShellExecute = true;
p.Start();
p.WaitForExit();
}
catch {

}
}

Viel Grüße
cinda
Member: Biber
Biber Feb 26, 2006 at 19:49:41 (UTC)
Goto Top
Hallo cinda,

hab Dich schon richtig vermisst face-wink
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
Member: cinda
cinda Feb 26, 2006 at 20:23:41 (UTC)
Goto Top
Hey Biber,

geht klar, schaue dir in ruhe "8 Mile" , ich schaue mir gerade "Hero" von Jet Lee in prosieben.

Bitte nach der pause möglichst mit Beispiel erklären, da du manchmal "schinesisch" redest und ich verstehe nur Bahnhof face-smile

Grüße
Cinda
Member: Biber
Biber Feb 26, 2006 at 23:02:01 (UTC)
Goto Top
Na gut, cinda,

ich versuche, weniger chinesisch zu schreiben, oder zumindest langsamer... face-wink

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 &ltwindows.h&gt

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... face-wink

Angenehmen Wochenbeginn
Biber
Member: cinda
cinda Feb 27, 2006 at 10:45:38 (UTC)
Goto Top
Hallo Biber,

alles kalro face-smile Danke und dir auch wünsche ich einen angenehmen Wochenanfang!

Viel Grüße
Cinda
Member: cinda
cinda Feb 27, 2006 at 15:36:06 (UTC)
Goto Top
Hallo Biber,

ich habe den process so gerufen, aber es funktionniert nicht. Hast du sowas schon mal getestet?


private void Copyfiles()
{
Process p=null;
try
{
p= new Process();
p.StartInfo.FileName = "xcopy.exe";
p.StartInfo.CreateNoWindow = false;
p.StartInfo.UseShellExecute = true;
p.Start();
p.WaitForExit();
}
catch {

}
}

Grüße
Cinda
Member: cinda
cinda Feb 28, 2006 at 09:39:42 (UTC)
Goto Top
Hallo Biber,

ich habe es anders probiert und es hat geklappt:

private void Copy()
{
Process p=null;
try
{
p= new Process();
p.StartInfo.FileName = "xcopy.exe";
p.StartInfo.Arguments = @"C:\temp\abc D:\temp\abc";
p.StartInfo.CreateNoWindow = false;
p.StartInfo.UseShellExecute = false;
p.Start();
p.WaitForExit();
}
catch {

}
}

Wenn ich ihn aber die quelle und ziel als parameter gebe funktionniert das nicht:

quelle= @"C:\temp\abc";
ziel = @"D:\temp\abc";

private void Copy()
{
Process p=null;
try
{
p= new Process();
p.StartInfo.FileName = "xcopy.exe";
p.StartInfo.Arguments = quelle + ziel ;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.UseShellExecute = true;
p.Start();
p.WaitForExit();
}
catch {

}
}


Viel Grüße
Cinda
Member: Biber
Biber Feb 28, 2006 at 10:50:38 (UTC)
Goto Top
Moin cinda,
im zweiten Copy()-Beispiel fehlt Dir doch auch ein Leerzeichen zwischen quelle und ziel, oder?

Wenn Du da noch eins einfügst, sollte es doch klappen.

Grüße
Biber
Member: cinda
cinda Feb 28, 2006 at 11:25:29 (UTC)
Goto Top
Hallo biber,

wenn du so meinst, klappt auch nicht

private void Copy()
{
Process p=null;
try
{
p= new Process();
p.StartInfo.FileName = "xcopy.exe";
p.StartInfo.Arguments = quelle ziel ;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.UseShellExecute = true;
p.Start();
p.WaitForExit();
}
catch {

}
}

Grüße
Cinda
Member: Biber
Biber Feb 28, 2006 at 11:45:31 (UTC)
Goto Top
*lacht*

Ich meinte eigentlich mehr so:
p.StartInfo.Arguments = quelle + " "+ ziel ;

...aber Deine Variante ist auch witzig... face-wink
Grüße
Biber
Member: cinda
cinda Feb 28, 2006 at 12:14:44 (UTC)
Goto Top
Ich weiß, das sah unlogisch aus. Ich habe heute meinen kopf zuhause vergessen. Mindestens habe ich dich zum lachen gebracht face-smile

Mit dem leerzeichen hast du recht. Es hat geklappt!

Viele Grüße
Cinda