2009-04-08 13 views
2

Für meine Tests verwende ich den Dialog 'Start> Ausführen' (nicht die cmd.exe).PowerShell-Ausgabe kann nicht umgeleitet werden, wenn -EncodedCommand verwendet wurde

Dies funktioniert gut, und ich bekomme 9 in log.txt

powershell -Command 4+5 > c:\log.txt 

Aber dies nicht funktioniert:

powershell -EncodedCommand IAA1ACsANwAgAA== > c:\log.txt 

So wie kann ich Ausgang in diesem Fall umleiten?

Experimental-Code:

function Test 
{ 
    $cmd = { 5+7 } 
    $encodedCommand = EncodeCommand $cmd 

    StartProcess "powershell -Command $cmd > c:\log.txt" 
    StartProcess "powershell -EncodedCommand $encodedCommand > c:\log2.txt" 
} 

function StartProcess($commandLine) 
{ 
    Invoke-WMIMethod -path win32_process -name create -argumentList $commandLine 
} 

function EncodeCommand($expression) 
{ 
    $commandBytes = [System.Text.Encoding]::Unicode.GetBytes($expression) 
    [Convert]::ToBase64String($commandBytes) 
} 

Antwort

4

Der Dialog "Ausführen" scheint nicht, wie es die Umleitung überhaupt zur Verfügung stellt. According to this usenet post erhalten Sie nur Umleitung, wenn Sie eine Konsole haben. Ich frage mich, ob der Redirection-Parameter von powershell.exe geparst wird, die Umleitung wählt, wenn sie keine codierte Eingabe empfängt? Klingt wie eine Frage für Raymond Chen.

Wie auch immer, dies funktioniert, auf Kosten einer ansonsten nutzlos Konsole von Laich:

cmd /c powershell -EncodedCommand IAA1ACsANwAgAA== > c:\ps.txt 
+0

Ah .. Tatsächlich ist das> nur ein PowerShell-Operator. – alex2k8

1

ich mit Umleitungsbefehl zusammen zu kodieren hatte.

function Test 
{ 
    $cmd = { 5+7 } 
    $encodedCommand = EncodeCommand "$cmd > 'c:\log2.log'" 

    StartProcess "powershell -Command $cmd > c:\log.txt" 
    StartProcess "powershell -EncodedCommand $encodedCommand" 
} 

So wird dies eine Summe schreiben 5 + 7 in c: \ log2.log

powershell -EncodedCommand IAA1ACsANwAgACAAPgAgACcAYwA6AFwAbABvAGcAMgAuAGwAbwBnACcA 

P. S.

crb vorgeschlagen, "cmd/c" zu verwenden. Aber in diesem Fall die codierte Skript Länge wird von der command line limitations

Auf Computern mit Microsoft Windows XP oder höher, die maximale Länge der Zeichenfolge beschränkt werden, die Sie an der Eingabe Prompt 8.191 Zeichen verwenden können. Auf Computern mit Microsoft Windows 2000 oder Windows NT 4.0 ist die maximale Länge der Zeichenfolge, die Sie an der Eingabeaufforderung verwenden können, 2047 Zeichen.

2

Der Unterschied zwischen diesen beiden Befehlen besteht darin, dass der Parameter -Command gierig ist. Es nimmt alles auf der Befehlszeile nach, während -EncodedCommand nicht gierig ist. Was der erste Befehl wirklich tut, ist:

powershell -Command "4+5 > c:\log.txt" 

So ist die neue Powershell-Instanz wird die Umleitung der Handhabung. Wenn Sie jedoch den Parameter -EncodedCommand verwenden, erkennt die neue PowerShell-Instanz die Umleitung nicht, weil Sie sie nicht in den codierten Befehl aufgenommen haben. Dies kann eine schlechte Sache sein, wenn die Umgebung, die PowerShell aufruft, keine Umleitung hat (wie in einer geplanten Task).

So, wie "crb" angezeigt wurde, müssen Sie entweder die Umleitung in Ihren Befehl codieren oder PowerShell von einer Umgebung aufrufen, die die Umleitung verarbeiten kann (wie cmd oder eine andere PowerShell-Instanz).

+0

Ich habe das schon gemacht. – alex2k8

+2

Ich erklärte, warum das passiert. Ich glaube, es ist wichtig, Fehler nicht nur im Code zu beheben, sondern zu verstehen, warum sie passieren. Manchmal kann es Ihnen sogar eine nette Art zeigen, andere Probleme zu lösen. – JasonMArcher

+0

Cool, danke Jason! – alex2k8

Verwandte Themen