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)
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top