将文件存储在批处理文件中?

时间:2013-10-24 20:10:13

标签: batch-file

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

如果这不可能,那么我必须将该文件与批处理文件分开包含,然后将其移动到必要的位置,但是我宁愿让这个文件对用户不可见,这样看起来就像文件一样正在批量生成。

这是可能的,如果是这样的话怎么样?提前谢谢。

4 个答案:

答案 0 :(得分:11)

您可以使用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 :(得分:8)

如果目标计算机是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)

答案 2 :(得分:2)

阅读HERE文件。 Msdos批处理不提供它们,但perl和ruby都可以使用。

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

答案 3 :(得分:0)

证书

foxidriive的答案会起作用,但是可以通过减少更多的IO操作来改善它。 解码base64文件时,certutil只关心begin和end标签。这是一个将创建并打开一个小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%