任何将多行 PowerShell 脚本转换为编码命令的程序?

Any program for turning a multi-line PowerShell script into an encoded command?

Any program for turning a multi-line PowerShell script into an encoded command?

我有一个 PowerShell 脚本,我想将其转换为编码命令。这通常需要将脚本变成单个语句,子语句由 ;.

分隔

是否有任何程序可以将多行 PowerShell 脚本转换为可以 运行 使用 powershell.exe -EncodedCommand <cmd> 的 Base64 编码命令?

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

假设 $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 基础结构本身,而是命令行解释器处理参数的方式([= 上的命令行33=] 总共有 32767 个字符的最大长度,如果我没记错的话,单个参数的长度也应该有额外的限制,这取决于你所在的系统 运行。

根据@mosè-bottacini 的回答,要成功 encode/decode 多行脚本,请尝试在使用 Get-Content 时添加 -Raw 标志,如下所示:

$expression = Get-Content -Path .\MyScriptFile.ps1 -Raw