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 und RedirectStandardOutput = true erhalte ich:
    • Das Prozessobjekt muss die UseShellExecute Eigenschaft auf false hat, um zu umleiten IO-Streams.
  • Wenn UseShellExecute = true und RedirectStandardOutput = false erhalte ich:
    • Das System kann die Datei nicht finden angegeben
  • Wenn useShellExecute = false und RedirectStandardOutput = true erhalte ich:
    • Das System kann die Datei nicht finden angegeben
  • Wenn UseShellExecute = false und RedirectStandardOutput = 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?

War es hilfreich?

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" 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top