2016-07-14 4 views
0

ich ein Programm namens „Copyfile“ geschrieben habe wiederholt eine Datei von lokalen zu einem Netzwerk freigegebenen Ordner zu kopieren, wie unter:C#: Unterschied zwischen einem Programm direkt ausführen und rufen Sie von einem anderen Prozess

List<string> log = new List<string>(); 
string originPath = "*LOCAL PATH*"; 
string targetPath = "*TARGET PATH*"; 

System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.FileName = "cmd.exe"; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardInput = true; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.CreateNoWindow = true; 

if (File.Exists(originPath)) 
{ 
    p.Start(); 
    StreamWriter sw = p.StandardInput; 
    sw.WriteLine(@"NET USE *TARGET IP* *PASSWORD* /USER:*USERNAME*"); 
    sw.WriteLine(@"COPY "+'"'+originPath+'"'+ " "+'"'+targetPath+'"'); 
    sw.WriteLine("Y"); 
    sw.WriteLine("EXIT"); 
    sw.Close();     
    p.WaitForExit(); 

    log.Add(p.StandardOutput.ReadToEnd()); 
} 
else 
{     
    log.Add("No file"); 
} 

Ich habe versucht, Dieses Programm in meinem Computer, wenn ich dieses Programm durch Doppelklick ausführen das Programm erfolgreich ausgeführt. Aber wenn ich ein anderes C# -Programm oder Windows Task Scheduler verwende, um es aufzurufen und auszuführen. Das Programm kann nicht normal arbeiten. Ich habe die Protokolldatei überprüft, um die Ausgabe zu sehen. Das Protokoll Doppelklick und ausführen zeigt:

D:\Downtime>NET USE *TARGET IP* *PASSWORD* /USER:*USERNAME* 
The command complete successfully. 
D:\Downtime>COPY *originpath* *targetpath* 
1 file(s) copied. 
D:\Downtime>EXIT 

Aber wenn ich ein anderes C# Programm oder Windows-Taskplaner verwenden, um sie auszuführen, das Protokoll zeigt

C:\Windows\system32>NET USE *TARGET IP* *PASSWORD* /USER:*USERNAME* 

C:\Windows\system32>COPY *originpath* *targetpath* 
0 file(s) copied. 

C:\Windows\system32>EXIT 

aussieht, wenn ich es von einem anderen rufen Programm oder der Windows-Task-Scheduler die "cmd.exe" wird nicht den Befehl "NET USE" ausführen, so dass ich keine Verbindung zum Netzwerk-Computer herstellen und Dateien auf sie kopieren kann. Weiß jemand, was das Problem ist? Vielen Dank.

+0

Laufwerke werden vom Benutzer-Token zugeordnet. Admins haben zwei AsAdmin und Limited. Sie müssen jedoch nichts tun. 'copy" \\ Servername \ Freigabename \ Ordner \ Datei.ext "" \\ Servername \ Freigabename \ Ordner \ Datei.ext "'. Das Zuordnen von Laufwerken ist eine Kompatibilitätsfunktion für Windows 95-Programme, die nicht mehr von Benutzern verwendet wurden. –

+0

Sehr wahrscheinlich wird die Fehlermeldung, die durch den 'NET USE' Befehl erzeugt wird, in' StandardError' geschrieben. Sie müssen diese Ausgabe auch erfassen, wenn Sie sehen möchten, was sie sagt. –

Antwort

0

Ich weiß nicht, dass Sie Pfad ist absoluter Pfad oder relativer Pfad. Wenn Sie in Ihrem Code einen relativen Pfad verwenden, sollten Sie erwägen, die WorkingDirectory-Eigenschaft der ProcessStartInfo-Instanz festzulegen.

Wenn Sie Ihr Programm direkt aufrufen. WorkingDirectory ist das Verzeichnis, das ausführbare Dateien enthält.

Wenn Sie Ihr Programm von einem anderen Prozess aufrufen, ist das Arbeitsverzeichnis das Verzeichnis eines anderen Prozesses - nicht Ihres Programms.

In diesem Fall müssen Sie die Eigenschaft WorkingDirectory korrekt festlegen.

Lesen Sie mehr unter here.

+0

Danke, ich füge WorkingDirectory zu meinem Programm hinzu und es funktioniert. –

Verwandte Themen