是否有用于将多行PowerShell脚本转换为编码命令的程序?

时间:2019-05-13 07:48:38

标签: powershell minify

  

是否有用于将多行PowerShell脚本转换为编码命令的程序?

我有一个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

2 个答案:

答案 0 :(得分:1)

假设$ 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)总的来说,如果我记得char的话,那么对单个参数的长度也应该有额外的限制,具体取决于您在其上运行的系统。

答案 1 :(得分:0)

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

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