Любая программа для превращения многострочного скрипта PowerShell в закодированную команду? - PullRequest
0 голосов
/ 13 мая 2019

Любая программа для преобразования многострочного скрипта PowerShell в закодированную команду?

У меня есть скрипт PowerShell, который я хочу преобразовать в закодированную команду.Обычно для этого требуется, чтобы сценарий был превращен в один оператор с под-операторами, разделенными ;.

. Существует ли какая-либо программа для преобразования многострочного сценария PowerShell в команду, закодированную в Base64, которую можно запуститьиспользуя powershell.exe -EncodedCommand <cmd>?

PS скрипт :

Invoke-Command -ScriptBlock {
    param(
        [Parameter(Mandatory=$false)][string]$param1
    )

    $a = 10
    $b = 5
    $c = $a + $b
    Write-Host "$a + $b = $c"
    function f($a, $b) {
        if ($a -lt $b) {
            return $a
        } 
        return $b
    }

    Write-Host "(f $a $b) = $(f $a $b)"
} -ArgumentList "HelloWorld"

powershell.exe -EncodedCommand :

$DebugPreference = 'Continue'

$content = Get-Content "$file"
Write-Debug "Content: $content"

$bytes = [System.Text.Encoding]::Unicode.GetBytes($content)
$b64 = [System.Convert]::ToBase64String($bytes)
Write-Debug "Base64: $b64"

powershell.exe -EncodedCommand "$b64"

Ошибка :

At line:1 char:118
+ ... r(Mandatory=$false)][string]$param1     )      $a = 10     $b = 5     ...
+                                                                ~~
Unexpected token '$b' in expression or statement.
At line:1 char:129
+ ... =$false)][string]$param1     )      $a = 10     $b = 5     $c = $a +  ...
+                                                                ~~
Unexpected token '$c' in expression or statement.
At line:1 char:146
+ ...     )      $a = 10     $b = 5     $c = $a + $b     Write-Host "$a + $ ...
+                                                        ~~~~~~~~~~
Unexpected token 'Write-Host' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

1 Ответ

1 голос
/ 13 мая 2019

при условии, что $ expression имеет тип [ScriptBlock]

$expression = {Write-Output "Hello, World!"}

или в случае, если у вас есть многострочный сценарий, скрипт в файле

$expression = get-content .\MyScriptFile.ps1

или в любом случае у вас естьмногострочная строка

$expression = 
@"
    Write-Output "Hello, World!";
    Write-Output "Another line";
"@;

Примечание: не забудьте поставить;(точка с запятой) в конце каждой строки оператора

затем вы сможете сделать это

$commandBytes = [System.Text.Encoding]::Unicode.GetBytes($expression)
$encodedCommand = [Convert]::ToBase64String($commandBytes)

$ encodedCommand затем может быть передан в powershell как

powershell.exe -EncodedCommand $encodedCommand

Примечание: вы можете достичь некоторого предела длины, это связано не с самой инфраструктурой powershell, а с тем, как интерпретатор параметров командной строки обрабатывает параметры (максимальная длина командной строки в windows составляет 32767 символов)если я хорошо помню, должно быть дополнительное ограничение на длину одного параметра, а также в зависимости от системы, на которой вы его используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...