Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

XCOPY und DEL im programm einbinden

Frage Entwicklung Batch & Shell

Mitglied: cinda

cinda (Level 1) - Jetzt verbinden

24.02.2006, aktualisiert 28.02.2006, 7351 Aufrufe, 16 Kommentare

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?
Mitglied: Biber
24.02.2006 um 14:34 Uhr
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
Bitte warten ..
Mitglied: cinda
24.02.2006 um 15:03 Uhr
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
Bitte warten ..
Mitglied: Biber
24.02.2006 um 15:13 Uhr
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?
Bitte warten ..
Mitglied: cinda
24.02.2006 um 15:22 Uhr
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
Bitte warten ..
Mitglied: Biber
24.02.2006 um 17:38 Uhr
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.
Bitte warten ..
Mitglied: cinda
26.02.2006 um 20:01 Uhr
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
Bitte warten ..
Mitglied: Biber
26.02.2006 um 20:49 Uhr
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
Bitte warten ..
Mitglied: cinda
26.02.2006 um 21:23 Uhr
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

Grüße
Cinda
Bitte warten ..
Mitglied: Biber
27.02.2006 um 00:02 Uhr
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 &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...

Angenehmen Wochenbeginn
Biber
Bitte warten ..
Mitglied: cinda
27.02.2006 um 11:45 Uhr
Hallo Biber,

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

Viel Grüße
Cinda
Bitte warten ..
Mitglied: cinda
27.02.2006 um 16:36 Uhr
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
Bitte warten ..
Mitglied: cinda
28.02.2006 um 10:39 Uhr
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
Bitte warten ..
Mitglied: Biber
28.02.2006 um 11:50 Uhr
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
Bitte warten ..
Mitglied: cinda
28.02.2006 um 12:25 Uhr
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
Bitte warten ..
Mitglied: Biber
28.02.2006 um 12:45 Uhr
*lacht*

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

...aber Deine Variante ist auch witzig...
Grüße
Biber
Bitte warten ..
Mitglied: cinda
28.02.2006 um 13:14 Uhr
Ich weiß, das sah unlogisch aus. Ich habe heute meinen kopf zuhause vergessen. Mindestens habe ich dich zum lachen gebracht

Mit dem leerzeichen hast du recht. Es hat geklappt!

Viele Grüße
Cinda
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows Netzwerk
USB-Gerät ins Netzwerk (Domäne) einbinden (4)

Frage von griss0r zum Thema Windows Netzwerk ...

Windows 7
Tool für Clients zum Drucker einbinden (6)

Frage von DragonKill zum Thema Windows 7 ...

Exchange Server
Zweite Exchange Postfach in Outlook 2010 einbinden (2)

Frage von DieAzubinne zum Thema Exchange Server ...

Microsoft Office
32 Bit CAD Programm und Excel 64 Bit geht nicht (5)

Frage von GrueneSosseMitSpeck zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...