2017-11-13 6 views
0

Ich habe ein Problem mit dem PowerShell-Befehl in einer WPF-App festgestellt. Die Grundvoraussetzung hierfür ist, dass PowerShell im Hintergrund ausgeführt werden sollte, ohne ein Konsolenfenster zu öffnen.C# So blenden Sie das PowerShell-Fenster aus

Wenn ich jedoch einen RunSpace erstellen und den Befehl in der Pipeline ausführen, kann ich das Konsolenfenster überhaupt nicht ausblenden. Folgendes ist mein Code:

Die einzige Möglichkeit, das Fenster zu verbergen, ist die PowerShell in einem Prozess auszuführen. Auf diese Weise kann ich den Kontext nicht wiederverwenden, da ich jedes Mal einen brandneuen PowerShell-Prozess gestartet habe. Hier sind meine Codes:

private void RunPowerShellProcess() 
{ 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    Process p = new Process(); 

    startInfo.CreateNoWindow = true; 
    startInfo.RedirectStandardOutput = true; 
    startInfo.RedirectStandardInput = true; 
    startInfo.RedirectStandardError = true; 

    startInfo.UseShellExecute = false; 
    startInfo.Arguments = "import-module vmware.appcapture;Start-AVAppCapture -Name Test"; 
    startInfo.FileName = "Powershell.exe"; 

    p.StartInfo = startInfo; 
    StringBuilder stringBuilder = new StringBuilder(); 
    p.OutputDataReceived += new DataReceivedEventHandler 
    (
     delegate(object sender, DataReceivedEventArgs e) 
     { 
      using (StreamReader output = p.StandardOutput) 
      { 
       stringBuilder.AppendLine(output.ReadToEnd()); 
      } 
     } 
    ); 
    p.ErrorDataReceived += new DataReceivedEventHandler 
    (
     delegate(object sender, DataReceivedEventArgs e) 
     { 
      using (StreamReader output = p.StandardError) 
      { 
       stringBuilder.AppendLine(output.ReadToEnd()); 
      } 
     } 
    ); 


    p.Start(); 
    p.WaitForExit(); 

    string finalStdOuputLine = p.StandardOutput.ReadToEnd(); 
    string finalStdErrorLine = p.StandardError.ReadToEnd(); 
    try 
    { 
     Result.Dispatcher.Invoke(new Action(() => 
     { 
      Result.Text = String.Format("Result: {0}, Error: {1}", finalStdOuputLine, finalStdErrorLine); 
     })); 
    } 
    catch (Exception e) 
    { 
    } 
} 

Ich möchte wirklich RunSpace verwenden. Aber wie kann ich einerseits einen PowerShell-Kontext wiederverwenden, andererseits aber das Konsolenfenster ausblenden?

+0

haben Ihr versucht, die mit folgenden 'StartInfo.WindowStyle = .ProcessWindowStyle.Hidden;' – MethodMan

+0

In meinem zweiten Codes Code-Schnipsel, ich den Prozess verwendet, um die Powershell-Fenster zu verstecken. Ich mag diese Methode jedoch nicht, da ich einen PowerShell-Kontext nicht verwenden kann. Zum Beispiel muss ich das Modul jedes Mal importieren, wenn ich den Befehl ausführe. Mit RunSpace kann ich jedoch einen Kontext wiederverwenden. Aber das Problem mit RunSpace ist, dass ich das Fenster nicht verstecken kann. Daher frage ich, ob ein Experte es weiß? – Fiona

Antwort

0

Ich erstellte eine Konsole App mit den folgenden und erlebt keine Powershell-Fenster überhaupt sichtbar. Ich benutze routinemäßig die Klassen RunSpace und RunSpacePool und habe nie erlebt, dass eine Powershell-Instanz sichtbar wurde.

public static void Main(string[] args) 
    { 
     var initial = InitialSessionState.CreateDefault(); 
     initial.ImportPSModule(new[] { "BITSTransfer" }); 

     var runSpace = RunspaceFactory.CreateRunspace(initial); 
     runSpace.Open(); 

     for (int i = 0; i < 5; i++) 
     { 
      using (Pipeline pipeline = runSpace.CreatePipeline()) 
      { 
       Command capture = new Command("Get-Command"); 
       capture.Parameters.Add("Module", "BITSTransfer"); 
       pipeline.Commands.Add(capture); 
        Console.WriteLine(string.Format("In loop {0}", i)); 
        System.Collections.ObjectModel.Collection<PSObject> outputCollection = pipeline.Invoke(); 
        foreach (PSObject item in outputCollection) 
        { 
         Console.WriteLine(item.BaseObject.ToString()); 
        } 
       } 
      } 
     } 

     runSpace.Close(); 
     Console.ReadLine(); 
    } 

Wie Sie sehen, erstellt dies einen Runspace und importiert ein Modul. Es erstellt dann eine Pipeline und schreibt die Befehle in diesem Modul fünf Mal auf den Bildschirm. Jedes Mal, wenn Sie denselben Runspace verwenden. Es wurden keine Powershell-Fenster erzeugt.

Ich bin mir nicht sicher, was das tut, aber ich bin mir auch nicht sicher, ob es verantwortlich für das Erstellen des Fensters, das Sie verweisen.

Result.Dispatcher.Invoke(new Action(() => 
    { 
     Result.Text = stringBuilder.ToString(); 
    })); 
Verwandte Themen