System.Diagnostics.Process Problem mit Working
-
20-09-2019 - |
Frage
Ich bin mit einem Drittanbieter-Software-Tool (Kommandozeilen-Tool) zur Zusammenführung von PDF-Dateien zusammen. Mit C # Ich versuche zu verwenden System.Diagnostics.Process
die ausführbare Datei zu laufen, aber ich komme mit einem paar Fehlern auf der Parametereinstellung abhängig.
- Wenn
UseShellExecute = true
undRedirectStandardOutput = true
erhalte ich:- Das Prozessobjekt muss die
UseShellExecute
Eigenschaft auffalse
hat, um zu umleiten IO-Streams.
- Das Prozessobjekt muss die
- Wenn
UseShellExecute = true
undRedirectStandardOutput = false
erhalte ich:- Das System kann die Datei nicht finden angegeben
- Wenn
useShellExecute = false
undRedirectStandardOutput = true
erhalte ich:- Das System kann die Datei nicht finden angegeben
- Wenn
UseShellExecute = false
undRedirectStandardOutput = false
erhalte ich:- Das System kann die Datei nicht finden angegeben
Der Code, der ausgeführt wird, ist die folgende:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\VeryPDF PDF Split-Merge v3.0";
p.StartInfo.FileName = "pdfpg.exe " + strFileNames.Trim() + " "
+ D2P_Folder_Converted + "\\" + strOutputFileName;
p.Start();
p.WaitForExit();
p.Close();
p.Dispose();
Kann jemand mir helfen, dieses Problem umgehen, bitte?
Lösung
Argumente sollten nicht in der Filename übergeben werden Eigenschaft. Sie sollten die Argumente Eigenschaft für diesen Einsatz :
p.StartInfo.Arguments = string.Format(
"{0} {1}",
strFileNames.Trim(),
Path.Combine(D2P_Folder_Converted, strOutputFileName)
);
p.StartInfo.WorkingDirectory = Path.Combine(GetProgramFilesX86(), "VeryPDF PDF Split-Merge v3.0");
p.StartInfo.FileName = "pdfpg.exe";
, wo die GetProgramFilesX86
Funktion wie so definiert werden kann:
static string GetProgramFilesX86()
{
var processorArchitecture = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432");
if(IntPtr.Size == sizeof(long) || !string.IsNullOrEmpty(processorArchitecture))
{
return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
}
return Environment.GetEnvironmentVariable("ProgramFiles");
}
Andere Tipps
Wenn UseShellExecute
ist false
die WorkingDirectory
Eigenschaft ändert seine Bedeutung!
Es wird das Arbeitsverzeichnis für den neuen Prozess nicht den Pfad zur ausführbaren Datei. Sie müssen stattdessen den vollständigen Pfad zu der ausführbaren Datei in der FileName
Eigenschaft angeben.
Ich bin kein Experte, den Prozess-API verwenden, aber es sieht aus wie Sie Befehlszeilenargumente in den Dateinamen platzieren. Versuchen Sie Argumente für die Befehlszeilenargumente verwenden. Und setzen Sie den vollständigen Pfad zur exe im Dateinamen.
Auch ein @ vor der Zeichenfolge mit Beseitigt die Notwendigkeit für die Verdoppelung der Schrägstriche.
p.StartInfo.FileName = @"C:\Program Files (x86)\VeryPDF PDF Split-Merge\pdfpg.exe"