2015-11-05 8 views
0

Я использую приведенный ниже пакетный скрипт, который имеет двоичную часть (.exe-программу), которая добавляется к нижней части скрипта. Я использовал этот трюк, чтобы прикрепить бинарную часть моего пакетного сценария:Как извлечь двоичные данные из командного файла с помощью команды findstr?

::Append binary part to your batch file with COPY 
copy /y /a "batchscript.bat" + /b program.exe /b combined.bat 

Для того, чтобы извлечь двоичную часть из пакетного сценария (combined.bat), я использую следующий метод с командой «Findstr»:

;;;===,,, @ECHO OFF 
;;;===,,, SETLOCAL ENABLEEXTENSIONS 
;;;===,,, 
;;;===,,, echo test line1 
;;;===,,, echo test line2 
;;;===,,, 
;;;===,,, findstr /v "^;;;===,,," %~f0 > program.exe 
;;;===,,, 
;;;===,,, echo test line3 
;;;===,,, echo test line4 
;;;===,,, exit /b 
;;;===,,, ::Below are binary data for program.exe 
binarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinary 
binarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinary 
... 

так что этот кусок кода извлекает бинарная часть из сценария program.exe:

findstr /v "^;;;===,,," %~f0 > program.exe 

Но как вниз стороны, каждая строка часть сценария должна начинаться с префикса следующий

;;;===,,, 

То, что я хочу сделать, это использовать префикс «;;; === ,,,» только в последней строке кода и извлечь все двоичные данные после этой строки. Можно ли достичь этого через какую-то сумасшедшую комбинацию findstr + для loop + if command? Пример:

@ECHO OFF 
SETLOCAL ENABLEEXTENSIONS 

echo test line1 
echo test line2 

HERE IS THE CODE TO EXTRACT BINARY PART AFTER LAST SCRIPT LINE 

echo test line3 
echo test line4 
exit /b 
;;;===,,, ::Below are binary data for program.exe 
binarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinary 
binarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinarybinary 
... 

Большое спасибо заранее.

ответ

1
@echo off 
setlocal 

rem Get the line number of the dividing line 
for /F "delims=:" %%a in ('findstr /N "^;;;===,,," "%~F0"') do set "lines=%%a" 

rem Extract the binary part from this file 
< "%~F0" (

    rem Pass thru the first lines 
    for /L %%i in (1,1,%lines%) do set /P "=" 

    rem Copy the rest 
    findstr "^" 

) > program.exe 
goto :EOF 

;;;===,,, ::Below are binary data for program.exe 

Эта программа функционально эквивалентна к коду, то есть эта программа потерпит неудачу, когда ваша программа терпит неудачу. Вы должны знать, что команда findstr может не успешно копировать двоичные данные во всех случаях.

Это решение эффективно использует тот факт, что команда findstr не перемещает указатель файла перенаправленного входного файла, который находится в нужном месте от предыдущих команд set /P.

+0

Спасибо за ответ, к сожалению, ваше решение не работает. Скрипт застревает и показывает сообщения об ошибках (FINDSTR: Строка XXXX слишком длинная.), Мне нужно закончить ее ctrl + break. Файл program.exe создается частично, однако его данные не соответствуют двоичным данным в пакетном файле. Таким образом, ваш код пропускает первые строки сценария, но двоичные данные не копируются правильно. Странно, когда оба кода функционально эквивалентны, потому что мой код «findstr» отлично работает на одном и том же командном скрипте и одинаковых двоичных данных. –

+0

Ops! Я просто понял, что когда команда 'findstr' считывает строки с перенаправленного ввода, макс. длина ограничена 8 КБ, поэтому оба метода не эквивалентны! Подробнее см. [Здесь] (http://stackoverflow.com/questions/8844868/what-are-the-undocumented-features-and-limitations-of-the-windows-findstr-comman). – Aacini