任何将多行 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
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 可以像
一样传递给 powershellpowershell.exe -EncodedCommand $encodedCommand
注意:您可能会遇到一些长度限制,这不是由于 powershell 基础结构本身,而是命令行解释器处理参数的方式([= 上的命令行33=] 总共有 32767 个字符的最大长度,如果我没记错的话,单个参数的长度也应该有额外的限制,这取决于你所在的系统 运行。
根据@mosè-bottacini 的回答,要成功 encode/decode 多行脚本,请尝试在使用 Get-Content
时添加 -Raw
标志,如下所示:
$expression = Get-Content -Path .\MyScriptFile.ps1 -Raw