Batch file 是否将文件存储在批处理文件中?

Batch file 是否将文件存储在批处理文件中?,batch-file,Batch File,嗨,我想在我写的基本批处理脚本中存储一个二进制文件。基本上,我希望脚本能够在某个时候输出这个预构建的文件,而不是从头开始创建它 如果这是不可能的,那么我将不得不将该文件与批处理文件分开,然后将其移动到必要的位置,但我更希望该文件对用户不可见,以便该文件似乎是从批处理中生成的 那么这可能吗?如果可能,如何实现?提前感谢。阅读这里的文档。Msdos批处理不提供它们,但perl和ruby都可以使用,并且可以使用 如果目标计算机是Vista及更高版本,则可以使用certutil.exe创建base64编

嗨,我想在我写的基本批处理脚本中存储一个二进制文件。基本上,我希望脚本能够在某个时候输出这个预构建的文件,而不是从头开始创建它

如果这是不可能的,那么我将不得不将该文件与批处理文件分开,然后将其移动到必要的位置,但我更希望该文件对用户不可见,以便该文件似乎是从批处理中生成的


那么这可能吗?如果可能,如何实现?提前感谢。

阅读这里的文档。Msdos批处理不提供它们,但perl和ruby都可以使用,并且可以使用


如果目标计算机是Vista及更高版本,则可以使用
certutil.exe
创建base64编码文本,并将其嵌入批处理文件中

这个例子有一个base64编码的文件,它只是
一个空格
,但是对于较大的二进制文件,技术是相同的

此批处理文件使用
certutil.exe
对证书和数据进行
解码
并创建文件,其中只有一个空格,没有回车符或换行符

@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
要对程序文件进行
编码
以放置在批处理文件中,请使用如下命令行,将
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)

您只需使用
COPY
将二进制部分附加到批处理文件中即可

copy /a batchBin.bat + /b myBinaryFile.bin /b combined.bat
batchBin.bat(带有
exit/b
的最后一行应以换行符结尾)

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

CERTUTIL FoxIDriLive的答案会起作用,但它可以通过更少的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 您可以使用创建自解压可执行文件,该文件包含所需的二进制文件、bat文件并执行压缩文件。您可以通过调用命令来使用指令或被破坏的UI模式

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

@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%

批处理文件是纯文本。它不能包含“二进制文件”。@KenWhite批处理文件可以包含二进制部分,但最好使用上述Aacinis技术link@jeb-确保批处理文件可以在某些标记之后的末尾包含二进制数据。但我不明白批处理脚本如何仅使用本机命令提取二进制数据并将其写入文件。但是,你没有说这是可以做到的,是吗;-)您只声明二进制内容可以嵌入到批处理脚本中。@dbenham可以解决此问题,请参阅。有一个非常强大的内置工具和一个很好的描述;-)Perl和Ruby通常不可用。如果您想要这样的解决方案,那么您最好(或者更好)使用一种编程语言,它允许您构建一个包含此文件的自包含可执行文件。或者甚至可以使用自解压存档。我认为OP需要一种脚本语言。Perl和Ruby不需要编译,安装起来相当容易。Python也能工作。+1,哦-很棘手。我想到了FINDSTR,但我一直在琢磨如何区分批处理脚本和二进制代码。我忘了,您可以在每个脚本行前面添加任意数量的标记分隔符。它甚至可以用于标签行
;;;==,,,:标签
。非常好的
findstr/v
对行长度有限制,因此可以使用小型二进制文件。我注意到视频文件出现错误:
FINDSTR:第3613257行太长。
在编码的二进制文件right@foxdrive?的每一行之前都包含回音。嵌入二进制文件可以节省解码时间,并且比base64文件占用更少的空间
@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%