Не удается перенаправить вывод PowerShell при использовании -EncodedCommand - PullRequest
2 голосов
/ 08 апреля 2009

Для моих тестов я использую диалог «Пуск> Выполнить» (не cmd.exe).

Это отлично работает, и я получаю 9 в log.txt

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

Но это не работает:

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

Так как я могу перенаправить вывод в этом случае?

Экспериментальный код:

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)
}

Ответы [ 3 ]

4 голосов
/ 09 апреля 2009

Диалог «Выполнить» не похоже на перенаправление вообще. Согласно этому сообщению usenet вы получаете перенаправление только при наличии консоли. Интересно, анализируется ли параметр redirection с помощью powershell.exe, который выбирает перенаправление, если он не получает закодированный ввод? Звучит как вопрос для Раймонд Чен .

В любом случае, это работает за счет порождения бесполезной консоли:

cmd /c powershell -EncodedCommand IAA1ACsANwAgAA== > c:\ps.txt
2 голосов
/ 09 апреля 2009

Разница между этими двумя командами в том, что параметр -Command является жадным. Он принимает все в командной строке после него, в то время как -EncodedCommand не является жадным. Первая команда действительно выполняет:

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

Итак, новый экземпляр PowerShell обрабатывает перенаправление. Однако если вы используете параметр -EncodedCommand, новый экземпляр PowerShell не увидит перенаправление, поскольку вы не включили его в закодированную команду. Это может быть плохо, если среда, вызывающая PowerShell, не имеет перенаправления (как в запланированной задаче).

Итак, как показало «crb», вам нужно либо закодировать перенаправление в вашу команду, либо вызвать PowerShell из среды, которая может обработать перенаправление (например, cmd или другой экземпляр PowerShell).

1 голос
/ 09 апреля 2009

Мне пришлось кодировать команду вместе с перенаправлением.

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

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

Таким образом, это запишет сумму 5 + 7 в c: \ log2.log

powershell -EncodedCommand IAA1ACsANwAgACAAPgAgACcAYwA6AFwAbABvAGcAMgAuAGwAbwBnACcA

приписка

crb предложил использовать "cmd / c". Но в этом случае длина закодированного скрипта будет ограничена ограничениями командной строки

На компьютерах под управлением Microsoft Windows XP или позже, максимальная длина строка, которую вы можете использовать в команде подсказка 8191 символов. На компьютеры под управлением Microsoft Windows 2000 или Windows NT 4.0, максимум длина строки, которую вы можете использовать в командной строке 2047 символы.

...