Non è possibile reindirizzare l'output PowerShell quando -EncodedCommand usato
-
06-09-2019 - |
Domanda
Per le mie prove sto usando 'Start> Esegui' finestra di dialogo (non il cmd.exe).
Questo funziona bene, e ottengo 9 in log.txt
powershell -Command 4+5 > c:\log.txt
Ma questo non funziona:
powershell -EncodedCommand IAA1ACsANwAgAA== > c:\log.txt
Così come posso reindirizzare l'output in questo caso?
Codice Sperimentale:
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)
}
Soluzione
La finestra "Esegui" non sembra che fornisce il reindirizzamento a tutti. Secondo questo post usenet voi ottenere solo reindirizzamento se si dispone di una console. Mi chiedo se il parametro di reindirizzamento viene analizzato da powershell.exe, che è la scelta di reindirizzare se non è la ricezione codificato ingresso? Suona come una domanda per il Raymond Chen .
In ogni caso, questo funziona, a scapito di deposizione delle uova una console altrimenti inutile:
cmd /c powershell -EncodedCommand IAA1ACsANwAgAA== > c:\ps.txt
Altri suggerimenti
La differenza tra questi due comandi è che il parametro -Command è avido. Prende tutto sulla riga di comando dopo, mentre -EncodedCommand non è avido. Quello che il primo comando è realmente facendo è:
powershell -Command "4+5 > c:\log.txt"
Quindi, la nuova istanza PowerShell si sta occupando del reindirizzamento. Tuttavia, se si utilizza il paramter -EncodedCommand, la nuova istanza di PowerShell non vede il reindirizzamento perché non hai includerlo nel comando codificato. Questo può essere una cosa negativa se l'ambiente chiamando PowerShell non ha reindirizzamento (come in un'operazione pianificata).
Quindi, come "CRB" ha mostrato, è necessario o codificare il reindirizzamento al tuo comando, oppure chiamare PowerShell da un ambiente in grado di gestire il reindirizzamento (come cmd, o un'altra istanza PowerShell).
ho dovuto codificare comando insieme reindirizzamento.
function Test
{
$cmd = { 5+7 }
$encodedCommand = EncodeCommand "$cmd > 'c:\log2.log'"
StartProcess "powershell -Command $cmd > c:\log.txt"
StartProcess "powershell -EncodedCommand $encodedCommand"
}
Quindi questo scriverà una somma 5 + 7 in C: \ log2.log
powershell -EncodedCommand IAA1ACsANwAgACAAPgAgACcAYwA6AFwAbABvAGcAMgAuAGwAbwBnACcA
P.S.
CRB ha suggerito di usare "cmd / c". Ma in questo caso la lunghezza di script codificato sarà vincolata dalla limitazioni linea
Nei computer che eseguono Microsoft Windows XP o versioni successive, la lunghezza massima del stringa che è possibile utilizzare al comando prompt è 8191 caratteri. Sopra computer che eseguono Microsoft Windows 2000 o Windows NT 4.0, il massimo lunghezza della stringa che è possibile utilizzare al comando richiesta 2047 caratteri.