1

Я использовал этот пакетный код: https://github.com/ITCMD/in2batch, и он выводит что-то похожее на это:

(
echo gfgqebfwrwe
echo grgrgehrg4wer
echo htrehteertrehrt
+12,000 more lines of that
) >>outputfile.txt

(вот актуальный файл) Однако программа просто закрывается. Он останавливается на строке 10,692 с echo . В строке, на которой он останавливается, или в строке после нет специальных символов. Есть ли у пакета ограничение на количество строк вывода в одной функции ()?

1 ответ1

1

Действительно, бег нескорректированные tempShare.bat привело к cmd аварии с ошибкой приложения и код исключения 0xc00000fd , что означает переполнение стека ( как ни странно - он остановился на другой линии , если запустить несколько раз , например , 10692 , так что я не могу дать какой - либо точный ответ о предел количества строк в скобках).

К счастью, не происходит ошибки при перенаправлении вывода из цикла for .

Следовательно, следующие незначительные изменения в оригинальном сценарии привели к желаемому эффекту. Скорректированный скрипт анализирует себя в простом цикле for /F и выполняет только echo команды между BEGIN CERTIFICATE и END CERTIFICATE включительно (см. Строки 5..16):

@echo off
SETLOCAL enableextensions
if exist "7za.exe" goto :10897117303211127370517328436 
echo creating file . . .
set "_out="
(
for /f "usebackq tokens=*" %%G in ("%~f0") do (
  if "%%~G"=="echo -----BEGIN CERTIFICATE-----" set "_out=yes"
  if defined _out %%~G
  if "%%~G"=="echo -----END CERTIFICATE-----" set "_out="
)
)>temp.txt
certutil -v -decode "temp.txt" "7za.exe"
REM  >nul 
REM del /f /q "temp.txt"
goto :10897117303211127370517328436
(
echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
… truncated 12000+ lines of that …
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAA==
echo -----END CERTIFICATE-----
)>temp.txt
certutil -v -decode "temp.txt" "7za.exe" >nul
del /f /q "temp.txt" 
:10897117303211127370517328436
pause

Выход:

d:\bat> erase 7za.exe 2>nul

d:\bat> D:\bat\SU\tempShare.bat
creating file . . .
Input Length = 808252
Output Length = 587776
CertUtil: -decode command completed successfully.
Press any key to continue . . .

d:\bat> 7za.exe -?

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Usage: 7za <command> [<switches>...] <archive_name> [<file_names>...]
       [<@listfiles...>]

… (truncated) …

Следующий tempShareExitLoop.bat делает то же самое, но останавливает чтение после достижения строки END CERTIFICATE . Важно: вставьте процедуру :OutCertificate где-то (сразу) под goto :eof в своем коде.

@echo off
SETLOCAL enableextensions
if exist "7za.exe" goto :10897117303211127370517328436 
echo creating file . . .
>temp.txt call :OutCertificate
certutil -v -decode "temp.txt" "7za.exe"
REM  >nul 
REM del /f /q "temp.txt"
goto :10897117303211127370517328436
(
echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
… truncated 12000+ lines of that …
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAAAAAAAA==
echo -----END CERTIFICATE-----
)>temp.txt
certutil -v -decode "temp.txt" "7za.exe" >nul
del /f /q "temp.txt" 
:10897117303211127370517328436
pause
goto :eof 

:OutCertificate
set "_out="
for /f "usebackq tokens=*" %%G in ("%~f0") do (
  if "%%~G"=="echo -----BEGIN CERTIFICATE-----" set "_out=yes"
  if defined _out %%~G
  if "%%~G"=="echo -----END CERTIFICATE-----" goto :eof
)
goto :eof

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .