Сохранить файл внутри командного файла?

Привет я пытаюсь сохранить бинарный файл внутри базового сценария, который я написал. По сути, я хочу, чтобы скрипт мог выводить этот готовый файл в какой-то момент вместо того, чтобы создавать его с нуля.

Если это невозможно, я должен был бы включить этот файл отдельно в пакетный файл, который затем переместил бы его в нужное место, но я бы предпочел, чтобы этот файл был невидим для пользователя, так что создается впечатление, что файл генерируется из партии.

Так возможно ли это, и если да, то как? Заранее спасибо.

3 ответа

Вы можете просто добавить двоичную часть в ваш командный файл с помощью 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)

CERTUTIL

Ответ foxidriive будет работать, но его можно улучшить с гораздо меньшим количеством операций ввода-вывода. При декодировании файла 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 и запускает упакованный файл. Вы можете использовать директивы или дефолтный режим пользовательского интерфейса, просто вызвав команду.

Альтернативные потоки данных

вы можете хранить данные в альтернативном потоке данных, а затем читать их с помощью 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%

Читайте о ЗДЕСЬ документах. Пакет MSDOS не предлагает их, но Perl и Ruby доступны и делают.

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

Другие вопросы по тегам