2017-01-31 5 views
0

Dank Abbas können Sie mit dem folgenden Code einen cmd-Prozess aufrufen und den Befehl mithilfe des PowerShell-Skripts übergeben.Weiterleiten von Eingaben an CMD unter Verwendung der CMD-Prozess-ID (PID) in Powershell

$psi = New-Object System.Diagnostics.ProcessStartInfo; 
$psi.FileName = "cmd.exe"; #process file 
$psi.UseShellExecute = $false; #start the process from it's own executable file 
$psi.RedirectStandardInput = $true; #enable the process to read from standard input 

$p = [System.Diagnostics.Process]::Start($psi); 

Start-Sleep -s 2 #wait 2 seconds so that the process can be up and running 

$p.StandardInput.WriteLine("dir"); #StandardInput property of the Process is a .NET StreamWriter object 

Nun, wie kann ich einen CMD-Prozess verwenden, der bereits existiert.

In besseren Worten, ich möchte die PID eines cmd.exe-Prozesses verwenden, der ausgeführt wird, und den Befehl an es übergeben.

+0

Wenn Sie mir erlauben, das Offensichtliche zu fragen: Warum brauchen Sie cmd, wenn Sie PowerShell haben? Was wird es für Sie tun, dass PowerShell nicht kann? –

+0

@JeroenMostert - Bestimmte Legacy-Programme reagieren nicht richtig, wenn sie direkt von PowerShell aufgerufen werden. Dies liegt hauptsächlich daran, wie PowerShell das Quoting und die Parameterübergabe handhabt. Im Allgemeinen würde ich meine Befehle jedoch nicht in Prozesse schreiben, sondern in eine Batchdatei schreiben und sie dann mit '&" CMD/C $ Batchfilename "' aufrufen. Siehe [Ausführen einer EXE-Datei in PowerShell mit Parametern mit Leerzeichen und Anführungszeichen] (http://stackoverflow.com/questions/1673967/how-to-run-an-exe-file-in-powershell-with-parameters- with-spaces-and-quotes) hier auf SO. –

+1

@JeffZeitlin: Ich habe speziell gefragt, weil ich nur an ein paar Szenarien denken kann, wo Sie mit einer * existierenden * cmd-Instanz interagieren wollen - aber keiner, bei dem das eigentlich der beste Ansatz ist. Sollte sich herausstellen, dass die Verwendung von cmd in diesem Fall völlig unnötig ist, umso besser. –

Antwort

0

Basierend auf @ Falcon Kommentar:

ich sicher sein will, dass die CMD als SYSTEM

ich der Code ausgeführt werden denken, funktionieren soll, was für ein Kommando-Shell als SYSTEM ausgeführt wird überprüft . Es wird true für jede passende Shell zurück, die als SYSTEM läuft, mit title = TEST:

Get-CimInstance Win32_Process -Filter "name = 'cmd.exe'" | ForEach-Object { 
    if ((Get-Process -Id $_.ProcessId).MainWindowTitle -eq 'TEST') { 
    (Invoke-CimMethod -InputObject $_ -MethodName GetOwner).User -eq 'SYSTEM' 
    } 
} 

Der obige Code muss in einer erhöhten Schale läuft

Der Code basiert auf this article prüft, ob die Eingabeaufforderung wird erhöht:

$p = Get-Process -Name cmd | where {$_.MainWindowTitle -eq 'TEST'} | 
    Select Name, @{Name="Elevated"; Expression={ if ($this.Name -notin @('Idle','System')) {-not $this.Path -and -not $this.Handle} } } 

Der obige Code in einem nicht erhöhten Power Instanz muss Lauf. Es testet auf das Fehlen eines Pfads & Handle - die die nicht erhöhte Shell für eine Eingabeaufforderung mit erhöhten Rechten nicht sehen kann. Ändern Sie die eq 'TEST' Bedingung zu Ihrem Fenster passen.

Verwandte Themen