For loop 使用FOR循环将代码复制到批处理文件中的标签之间

For loop 使用FOR循环将代码复制到批处理文件中的标签之间,for-loop,command-line,windows-7,copy,batch-processing,For Loop,Command Line,Windows 7,Copy,Batch Processing,好的,所以我写了很多批处理文件。不久前,我问了一个问题user:cmd,关于如何将正在运行的批处理文件的一部分复制到新的批处理文件中, 如果你打算在批处理文件中使用它一次,那么它是有效的。我的目标是从单个安装批中创建多个大型批处理文件。如果他们选择安装,那么批处理文件将运行以下命令 cls setlocal EnableDelayedExpansion color e ::Start of embedded code set Begin= for /F "delims=:" %%a in (

好的,所以我写了很多批处理文件。不久前,我问了一个问题
user:cmd
,关于如何将正在运行的批处理文件的一部分复制到新的批处理文件中, 如果你打算在批处理文件中使用它一次,那么它是有效的。我的目标是从单个安装批中创建多个大型批处理文件。如果他们选择安装,那么批处理文件将运行以下命令

cls
setlocal EnableDelayedExpansion
color e
::Start of embedded code


set Begin=
for /F "delims=:" %%a in ('findstr /N "^:EMBEDDED_CODE" "%~F0"') do (
if not defined Begin (
set Begin=%%a
) else (
  set End=%%a
)
)
::*****************************************************************************
(for /F "skip=%Begin% tokens=1* delims=[]" %%a in ('find /N /V "" "%~F0"') do (
   if %%a equ %End% goto :Build-file2
   echo(%%b
)) > file1.bat & goto :Build-file2
)

goto :Build-file2

:EMBEDDED_CODE Begin

CODE TO PUT INTO "file1.bat"

:EMBEDDED_CODE End


:Build-file2

cls
setlocal EnableDelayedExpansion
color e
::Start of embedded code


set Begin=
for /F "delims=:" %%a in ('findstr /N "^:EMBEDDED_CODE" "%~F0"') do (
if not defined Begin (
set Begin=%%a
) else (
  set End=%%a
)
)
::*****************************************************************************
(for /F "skip=%Begin% tokens=1* delims=[]" %%a in ('find /N /V "" "%~F0"') do (
   if %%a equ %End% goto :EOF
   echo(%%b
)) > file2.bat & goto :EOF
)

goto :EOF

:EMBEDDED_CODE Begin

CODE TO PUT INTO "file2.bat"

:EMBEDDED_CODE End

出现的问题不是只在标签
EMBEDDED\u code Begin
EMBEDDED\u code End
之间复制代码,而是在第一个
FOR
循环中,它从
EMBEDDED\u code Begin
复制到脚本的最底部,将其放入我想要的文件中,然后转到下一个
FOR
循环,在to标签之间使用不同的代码重复该过程。因此
file1.bat
file2.bat
都包含完全相同的代码,但具有所需的文件名
file1.bat
file2.bat

为什么你会期望与你得到的结果不同?FINDSTR将搜索整个文件,因此
Begin
被设置为第一个出现的
:嵌入在第一个代码块中的\u code
,而
End
被设置为最后一个代码块中的最后一个出现的值(最后一个值集获胜)。您复制了代码,因此当然会得到两次相同的错误结果

只需更改第二个代码块中的标签,可能是
:EMBEDDED_CODE2
,并相应地调整第二个FINDSTR。到时候一切都会好起来的

我经常使用稍微不同的方法来最小化文件读取量。只需修改给定嵌入代码块中具有相同唯一前缀的所有行。然后FINDSTR可以直接输出所需的行,并使用FOR/F去除前缀。您只需要前缀以与代码开头不匹配的字符结尾

读取带有FOR/F的文件时,应小心启用延迟扩展。如果嵌入的代码包含
,则会损坏和延迟扩展已启用。(除非
被转义,但这可能会很痛苦)


这几乎可以满足您的需要

此代码需要读取两次输入文件,第一次是定位要处理的行的范围(findstr行编号),第二次是提取它们。在第二个循环中,再次使用findstr编号,以避免/f
压缩空行和更改行编号

另一方面,处理extacted文本中特殊字符的问题,根据需要启用和禁用延迟扩展

@echo off

    setlocal enableextensions enabledelayedexpansion

    call :extractEmbedded "Section1" extracted.txt
    if not errorlevel 1 (
        cls
        type extracted.txt
    )

    exit /b

:extractEmbedded id outputFile
    rem prepare environment
    setlocal enableextensions enabledelayedexpansion

    rem asume failure on execution
    set "_return=1"

    rem find embedded zone in current file
    set "_start="
    set "_end="
    for /f "tokens=1 delims=:" %%l in ('findstr /n /b /c:":EMBEDDED %~1" "%~f0"') do (
        if not defined _start ( set "_start=%%l" ) else ( set "_end=%%l" )
    )

    rem adjust lines to process
    set /a "_start+=0"
    set /a "_end-=1"

    rem if nothing found, task done
    if %_start% GEQ %_end% goto endExtractEmbedded

    rem prepare file extraction
    if "%_start%"=="0" (set "_skip=" ) else ( set "_skip=skip^=%_start%" )

    rem extract proper area of file to output file
    (for /f tokens^=^*^ %_skip%^ eol^= %%l in ('findstr /n "^" "%~f0"') do if !_start! LSS !_end! (
        setlocal disabledelayedexpansion
        set "_line=%%l"
        setlocal enabledelayedexpansion
        echo(!_line:*:=!
        endlocal & endlocal 
        set /a "_start+=1"
    ))>"%~2" 

    rem everything ok
    set "_return=0"

:endExtractEmbedded
    rem exit with errorlevel
    endlocal & exit /b %_return%



:EMBEDDED Section1

    This is a section; of embedded!!! code
    that needs to be extracted to generate
    a new file to be processed.
    TEST: !""$%&/()=?¿^*[];,:-\|

:EMBEDDED Section1
也许不是最好的表演,但似乎很管用。根据需要进行调整

@echo off

    setlocal enableextensions enabledelayedexpansion

    call :extractEmbedded "Section1" extracted.txt
    if not errorlevel 1 (
        cls
        type extracted.txt
    )

    exit /b

:extractEmbedded id outputFile
    rem prepare environment
    setlocal enableextensions enabledelayedexpansion

    rem asume failure on execution
    set "_return=1"

    rem find embedded zone in current file
    set "_start="
    set "_end="
    for /f "tokens=1 delims=:" %%l in ('findstr /n /b /c:":EMBEDDED %~1" "%~f0"') do (
        if not defined _start ( set "_start=%%l" ) else ( set "_end=%%l" )
    )

    rem adjust lines to process
    set /a "_start+=0"
    set /a "_end-=1"

    rem if nothing found, task done
    if %_start% GEQ %_end% goto endExtractEmbedded

    rem prepare file extraction
    if "%_start%"=="0" (set "_skip=" ) else ( set "_skip=skip^=%_start%" )

    rem extract proper area of file to output file
    (for /f tokens^=^*^ %_skip%^ eol^= %%l in ('findstr /n "^" "%~f0"') do if !_start! LSS !_end! (
        setlocal disabledelayedexpansion
        set "_line=%%l"
        setlocal enabledelayedexpansion
        echo(!_line:*:=!
        endlocal & endlocal 
        set /a "_start+=1"
    ))>"%~2" 

    rem everything ok
    set "_return=0"

:endExtractEmbedded
    rem exit with errorlevel
    endlocal & exit /b %_return%



:EMBEDDED Section1

    This is a section; of embedded!!! code
    that needs to be extracted to generate
    a new file to be processed.
    TEST: !""$%&/()=?¿^*[];,:-\|

:EMBEDDED Section1

我也尝试过,但没有成功,但我还没有尝试过您提供的代码。