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
我也尝试过,但没有成功,但我还没有尝试过您提供的代码。