嗨,我试图将二进制文件存储在我编写的基本批处理脚本中。基本上我希望脚本能够在某个时候输出这个预建文件,而不是从头开始创建它。
如果这是不可能的,那么我将不得不将此文件与批处理文件分开包含,然后将其移动到必要的位置,但我宁愿让这个文件对用户不可见,以便看起来文件正在生成从批次中。
那么这可能吗?如果可以,怎么办?提前致谢。
嗨,我试图将二进制文件存储在我编写的基本批处理脚本中。基本上我希望脚本能够在某个时候输出这个预建文件,而不是从头开始创建它。
如果这是不可能的,那么我将不得不将此文件与批处理文件分开包含,然后将其移动到必要的位置,但我宁愿让这个文件对用户不可见,以便看起来文件正在生成从批次中。
那么这可能吗?如果可以,怎么办?提前致谢。
您可以简单地将二进制部分附加到您的批处理文件中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 命令,它输出所有不以 . 开头的行;;;===,,,
。
由于它们都是标准的批处理分隔符,它们可以以任意组合作为批处理文件中任何命令的前缀。
如果目标机器是 Vista 或更高版本,那么您可以使用certutil.exe
并创建一个 base64 编码文本,您可以将其嵌入到批处理文件中。
这个例子有一个 base64 编码的文件,只是a single space
.,但技术与较大的二进制文件相同。
此批处理文件用于certutil.exe
证书decode
和数据,并创建其中包含单个空格的文件,没有回车或换行。
@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)
阅读 HERE 文档。Msdos batch 不提供它们,但 perl 和 ruby 都可用并且可以。
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创建打包所需二进制文件、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%