【问题标题】:Store a file inside of a batch file?将文件存储在批处理文件中?
【发布时间】:2013-10-24 20:10:13
【问题描述】:

您好,我正在尝试将二进制文件存储在我编写的基本批处理脚本中。基本上我希望脚本能够在某个时候输出这个预建文件,而不是从头开始创建它。

如果这是不可能的,那么我将不得不将此文件与批处理文件分开包含,然后将其移动到必要的位置,但我宁愿让这个文件对用户不可见,以便看起来文件正在从批处理中生成。

那么这可能吗?如果可以,怎么办?提前致谢。

【问题讨论】:

  • 批处理文件是纯文本。它不能包含“二进制文件”。
  • @KenWhite 批处理文件可以包含二进制部分,但最好使用上面链接中描述的 Aacinis 技术
  • @jeb - 在某些标记之后,确保批处理文件最后可以包含二进制数据。但我看不到批处理脚本如何提取二进制数据并将其写入文件仅使用本机命令。但是,您并没有说可以做到,是吗 ;-) 您只是说二进制内容可以嵌入到批处理脚本中。
  • @dbenham 可以解决,见my answerfindstr 有一个非常强大的内置工具和一个很好的描述;-)

标签: batch-file


【解决方案1】:

您可以使用COPY 简单地将二进制部分附加到您的批处理文件中。

copy /a batchBin.bat + /b myBinaryFile.bin /b combined.bat

batchBin.bat(最后一行exit /b 应该以换行符结尾)

    ;;;===,,,@echo off
    ;;;===,,,echo line2
    ;;;===,,,findstr /v "^;;;===,,," "%~f0" > output.bin
    ;;;===,,,exit /b

关键是findstr命令,它输出所有不以;;;===,,,开头的行。
由于它们都是标准的批处理分隔符,它们可以任意组合作为批处理文件中任何命令的前缀。

【讨论】:

  • +1,哦 - 棘手。我想到了 FINDSTR,但我一直在弄清楚如何区分批处理脚本和二进制代码。我忘记了你可以在每个脚本行前面加上任意数量的标记分隔符。它甚至适用于标签行;;;===,,, :label。很不错
  • findstr /v 对行长有限制,因此可能适用于小型二进制文件。我注意到视频文件出现错误:FINDSTR: Line 3613257 is too long.
【解决方案2】:

如果目标机器是 Vista 或更高版本,那么您可以使用 certutil.exe 并创建一个 base64 编码文本,您可以将其嵌入批处理文件中。

这个例子有一个 base64 编码的文件,它只是 a single space,但该技术与较大的二进制文件相同。

此批处理文件使用certutil.exedecode 的证书和数据,并创建包含单个空格、没有回车或换行的文件。

@echo off
(
echo -----BEGIN CERTIFICATE-----
echo IA==
echo -----END CERTIFICATE-----
)>file.tmp
certutil -decode file.tmp "file with a single space.txt" >nul
del file.tmp

encode 一个用于放置在批处理文件中的程序文​​件,您可以使用这样的命令行,将myprogram.exe 替换为您的程序名称:

certutil -encode -f "myprogram.exe" file.tmp

然后将file.tmp的内容放到批处理文件中:

@echo off
(
echo -----BEGIN CERTIFICATE-----
echo place the data from file.tmp here
echo as it is listed inside the file
echo -----END CERTIFICATE-----
)>file.tmp
certutil -decode file.tmp "myprogram.exe" >nul
del file.tmp

将回显添加到每一行的前面,然后使用来自file2.tmp 的数据是相当容易的:

@echo off
for /f "delims=" %%a in (file.tmp) do >>file2.tmp (echo(echo %%a)

【讨论】:

  • 你在编码的二进制右@foxdrive的每一行之前包含回声?
  • 嵌入二进制文件可以节省解码时间,并且比base64文件占用更少的空间
【解决方案3】:

阅读 HERE 文档。 msdos batch 不提供它们,但 perl 和 ruby​​ 都可用并且可以。

http://en.wikipedia.org/wiki/Here_document

【讨论】:

  • Perl 和 Ruby 不常用。如果您要寻求这样的解决方案,您最好(或更好)获取一种编程语言,该语言允许您构建一个独立的可执行文件,该可执行文件也可以包含此文件。或者甚至可以使用自解压存档。
  • 我认为 OP 想要一种脚本语言。 Perl 和 Ruby 不需要编译,并且相当容易安装。 Python 也可以。
【解决方案4】:

证明

foxidriive 的答案会起作用,但可以通过更少的 IO 操作来改进它。 在解码 base64 文件时,certutil 只关心开始和结束标签。这是一个将创建并打开一个小的 jpg 文件的示例:

@echo off

del /q /f pointer.jpg >nul 2>nul
certutil -decode "%~f0" pointer.jpg
hh.exe pointer.jpg
exit /b %errorlevel%

-----BEGIN CERTIFICATE-----
/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMgAA/+4ADkFkb2Jl
AGTAAAAAAf/bAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDg0NDgwR
DxITFBMSDxgYGhoYGCMiIiIjJycnJycnJycnJwEJCAgJCgkLCQkLDgsNCw4RDg4O
DhETDQ0ODQ0TGBEPDw8PERgWFxQUFBcWGhoYGBoaISEgISEnJycnJycnJycn/8AA
EQgACgAKAwEiAAIRAQMRAf/EAFsAAQEBAAAAAAAAAAAAAAAAAAAGBwEBAQAAAAAA
AAAAAAAAAAAAAAEQAAIBAwQDAAAAAAAAAAAAAAEDAgARBSExIwQSIhMRAQEBAAAA
AAAAAAAAAAAAAAARIf/aAAwDAQACEQMRAD8A13PZ5eIX3gO8ktKZfFPksvQ8r4uL
ecJmx1BMSbm8D6UVKVcg/9k=
-----END CERTIFICATE-----

IEXPRESS

您可以使用IEXPRESS 创建打包所需二进制文件的自解压可执行文件、bat 文件并执行打包文件。您可以通过调用命令来使用指令或默认的 UI 模式。

备用数据流

您可以将数据存储在备用数据流中,然后使用 powershell 读取它。请注意,大多数文本编辑器都会删除 ADS:

@echo off
del new.jpg /f /q >nul 2>&1
chcp  65001
type pointer.jpg >"%~f0:bindata"
powershell "$data=Get-Content -path """%~f0"""  -stream bindata;Out-File -FilePath '.\new.jpg' -InputObject $data -Encoding unicode;"
exit /b %errorlevel%

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 2016-12-24
    • 2015-03-23
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多