Сохранить файл внутри командного файла?
Привет я пытаюсь сохранить бинарный файл внутри базового сценария, который я написал. По сути, я хочу, чтобы скрипт мог выводить этот готовый файл в какой-то момент вместо того, чтобы создавать его с нуля.
Если это невозможно, я должен был бы включить этот файл отдельно в пакетный файл, который затем переместил бы его в нужное место, но я бы предпочел, чтобы этот файл был невидим для пользователя, так что создается впечатление, что файл генерируется из партии.
Так возможно ли это, и если да, то как? Заранее спасибо.
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 доступны и делают.