Действительно, бег нескорректированные 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