如何将二进制blob附加到PowerShell脚本以作为脚本文本被忽略?

时间:2015-12-30 13:09:12

标签: powershell executable

Unix shell(bash,dash tries)逐行解释脚本。这允许将一些二进制数据附加到脚本的末尾。我的特定示例是一个Jar文件,可以自动解压缩或从该脚本运行。

我想知道PowerShell是否也能以某种方式实现。我尝试并收到错误,表明PowerShell似乎在开始运行之前先解析整个文件。

有没有办法标记文件的其余部分,以便PowerShell不会尝试解释它而只是忽略它?

由于我的具体用例是我想使Jar文件可执行,因此依赖于base64编码二进制blob的解决方案不起作用。

更加明确:脚本基本上会运行

java -jar $MyInvocation.MyCommand.Definition @Args

这样java就会将该文件用作jar文件。

1 个答案:

答案 0 :(得分:1)

是什么让您认为使用base64编码的解决方案不起作用?将文件转换为base64字符串,如下所示:

$bytes = [IO.File]::ReadAllBytes('C:\path\to\your.jar')
[Convert]::ToBase64String($bytes)

并将字符串作为变量放入脚本中:

$jarData = 'UEsDBBQAAAAA...'

如果你喜欢多行的base64字符串,你可以像这样包装它:

[Convert]::ToBase64String($bytes) -replace '(.{80})', "`$1`n"

并将其放入脚本中:

$jarData = @'
UEsDBBQAAAAA...
...
'@

让您的脚本解码数据并在执行时将其保存回文件:

$bytes = [Convert]::FromBase64String($jarData)
[IO.File]::WriteAllBytes("$env:TEMP\your.jar", $bytes)

据我所知,这是在PowerShell脚本中嵌入二进制数据的唯一方法。