Windows批处理、按分隔符拆分文件、细化

Windows批处理、按分隔符拆分文件、细化,windows,batch-file,Windows,Batch File,我有一个装满文本文件的文件夹,需要根据分隔符(可选)的存在进行拆分。我在这里找到了如何实际拆分文件的答案: @echo off&setlocal 设置“file=\u frmCore.frm” 对于/f“delims=[]”中的%%i('^ 对代码所做的更改: 对目录中的所有文件将其包装成循环:请参阅以获取/F“delims=“%%G对符合条件的所有文件进行循环:findstr/m“^%\sfind%$”%\u files% “SearchTermHere”是一行中的第一个(唯一一行):^=行的

我有一个装满文本文件的文件夹,需要根据分隔符(可选)的存在进行拆分。我在这里找到了如何实际拆分文件的答案:

@echo off&setlocal
设置“file=\u frmCore.frm”
对于/f“delims=[]”中的%%i('^
对代码所做的更改:

  • 对目录中的所有文件将其包装成循环:请参阅
    以获取/F“delims=“%%G
    对符合条件的所有文件进行循环:
    findstr/m“^%\sfind%$”%\u files%
  • “SearchTermHere”是一行中的第一个(唯一一行):
    ^
    =行的开头和
    $
    =在
    findstr/m“^%\u sfind%$”%\u files%
    中使用,而不是
    查找
  • 不要创建两个新文件,而是将“搜索词后”部分移动到一个新文件中,并将其从原始文件中删除:请参见
    move/Y“%%G.new1”“%%G”
    解决方法。操作的
    move
    命令仅出于调试目的而在此处插入
    ECHO
    。在调试之前从该行删除
    ECHO
  • 参数化要在其中操作的文件夹名称,以便我可以从其他程序调用:
    • 调用“批处理路径\31749577.bat”“文件夹路径”
    • 请参阅
      %~1
      测试:如果向批处理提供了一个参数并表示一个文件夹,(更多信息)和
    • 请参阅:
      PUSHD
      更改当前目录/文件夹,并存储以前的文件夹/路径,以供
      POPD
      命令使用
  • 如果%%i gtr%%i(…
    %%i
    循环中,%%i gtr%%i(…
    ),则棘手的
    “%%G.new2”more+%%i
    命令将替换为效率较低但易于理解的
    命令。但是,下一个代码段(整个
    %%G
    循环)也将起作用:

    for /F "delims=" %%G in ('findstr /m "^%_sfind%$" %_files%') do (
      for /f "delims=:" %%i in ('findstr /n "^%_sfind%$" "%%G"') do (
        >"%%G.new1" (for /f "tokens=1* delims=:" %%I in ('
             findstr /n "^" "%%G"') do if %%I lss %%i echo(%%J)
        <"%%G">"%%G.new2" more +%%i
      )
      rem remove `ECHO` from next line no sooner than debugged!
      ECHO move /Y "%%G.new1" "%%G" 
      type "%%G.new?"
    )
    
    for/F“delims=“%%G in('findstr/m“^%\u sfind%$”%%\u files%”)do(
    对于/f“delims=:”%%i in('findstr/n“^%\u sfind%$”“%%G“)do(
    >“%%G.new1”(for/f“tokens=1*delims=:”%%I in('
    findstr/n“^”“%%G””)如果%%I lss%%I回显(%%J)怎么办
    “%%G.new2”更多+%%i
    )
    rem在调试之前立即从下一行删除“ECHO”!
    回显移动/Y“%%G.new1”“%%G”
    键入“%%G.new?”
    )
    
    对不起。虽然您的描述内容很广泛,但也令人困惑。批处理文件如下:

    • 搜索一行“SearchTermHere”
    • 如果上一行是“上一行”: 从SearchTerm后面的行移动到文件末尾,再移动到另一个文件
    • 对文件夹中的所有文件重复上一过程

    @echo关闭
    setlocal EnableDelayedExpansion
    设置“find=SearchTermHere”
    设置“prevLine=PreviousLine”
    rem处理参数中给定的文件夹
    cd%1
    rem处理文件夹中的所有文件
    对于/F“delims=“%%F in('dir/A-D/B')do(
    rem获取搜索行的行号-1
    设置“numLines=”
    对于/F“delims=:”%%a in('findstr/N“^%find%$”%%F“),请设置/a“numLines=%%a-1”
    如果定义了numline(
    rem打开代码块以读取输入文件/创建输出文件
    <“%%F”(
    rem复制numLines-1行
    对于(1,1,%numLines%)中的/L%%i,请执行以下操作(
    设置“行=”
    设置/P“行=”
    回声(!线!
    )
    rem如果搜索前的行是prevLine
    如果“!line!”等式“%prevLine%”(
    rem仅将搜索行复制到原始文件
    设置/P“行=”
    回声!线路!
    rem并将其余行复制到另一个文件中
    findstr“^”>“%%~nF-PART2%%~xF”
    )
    )>“%%F.tmp”
    如果存在“%%~nF-PART2%%~xF”(
    rem用创建的输出文件替换原始文件(第一部分)
    移动/Y“%%F.tmp”“%%F”>NUL
    )否则(
    删除输出文件
    del“%%F.tmp”
    )
    )
    )
    

    有关此方法的进一步解释,请参见。

    抱歉,我无法使用任何一种建议的解决方案。但是它们确实有所帮助-我花了两天的时间学习批处理文件中涉及的(奇怪的)语法和操作,并提出了以下建议。它并没有完成我所寻找的全部功能(为了进一步支持,我对输出文件的程序做了一些修改),但它确实完成了工作:

    @ECHO off
    setlocal EnableDelayedExpansion
    
    :: change the working directory to match the input
    cd /D %~d1
    cd %~p1\
    
    :: loop all .frm files and find the CodeBehindForm string
    for %%F in (*.frm) do (
    
     for /F "delims=[]" %%a in ('^<%%F find /n "CodeBehindForm"') do (
        if %%a gtr 0 ( 
            for /F "tokens=1*delims=[]" %%i in ('^<"%%F" find /n /v ""') do if %%i gtr %%a echo(%%j)>>"%%~nF.vb" 
            for /F "tokens=1*delims=[]" %%i in ('^<"%%F" find /n /v ""') do if %%i lss %%a echo(%%j)>>"%%~nF.fwm" 
    
            :: if the codebehind was found and parsed out, there's a .fwm and .vb file
            :: remove the original
            if exist %%~nF.vb del %%F
        )
    )
    :: change the .fwm extensions back to their original .frm extensions
    ren *.fwm *.frm
    
    @ECHO关闭
    setlocal EnableDelayedExpansion
    ::更改工作目录以匹配输入
    cd/D%~d1
    cd%~p1\
    ::循环所有.frm文件并查找CodeBehindForm字符串
    对于(*.frm)中的%%F,请执行以下操作(
    对于/F“delims=[]”中的%%a('^
    
    for /F "delims=" %%G in ('findstr /m "^%_sfind%$" %_files%') do (
      for /f "delims=:" %%i in ('findstr /n "^%_sfind%$" "%%G"') do (
        >"%%G.new1" (for /f "tokens=1* delims=:" %%I in ('
             findstr /n "^" "%%G"') do if %%I lss %%i echo(%%J)
        <"%%G">"%%G.new2" more +%%i
      )
      rem remove `ECHO` from next line no sooner than debugged!
      ECHO move /Y "%%G.new1" "%%G" 
      type "%%G.new?"
    )
    
    @echo off
    setlocal EnableDelayedExpansion
    
    set "find=SearchTermHere"
    set "prevLine=PreviousLine"
    
    rem Process the folder given in parameter
    cd %1
    
    rem Process all files in folder
    for /F "delims=" %%F in ('dir /A-D /B') do (
    
       rem Get the line number of the search line - 1
       set "numLines="
       for /F "delims=:" %%a in ('findstr /N "^%find%$" "%%F"') do set /A "numLines=%%a-1"
       if defined numLines (
    
          rem Open a code block to read-input-file/create-output-file
          < "%%F" (
    
             rem Copy numLines-1 lines
             for /L %%i in (1,1,%numLines%) do (
                set "line="
                set /P "line="
                echo(!line!
             )
    
             rem If the line before search is prevLine
             if "!line!" equ "%prevLine%" (
                rem Copy just the search line to original file
                set /P "line="
                echo !line!
                rem and copy the rest of lines to another file
                findstr "^" > "%%~nF-PART2%%~xF"
             )
    
          ) > "%%F.tmp"
    
          if exist "%%~nF-PART2%%~xF" (
             rem Replace original file with created output file (first part)
             move /Y "%%F.tmp" "%%F" > NUL
          ) else (
             rem Remove the output file
             del "%%F.tmp"
          )
    
       )
    
    )
    
    @ECHO off
    setlocal EnableDelayedExpansion
    
    :: change the working directory to match the input
    cd /D %~d1
    cd %~p1\
    
    :: loop all .frm files and find the CodeBehindForm string
    for %%F in (*.frm) do (
    
     for /F "delims=[]" %%a in ('^<%%F find /n "CodeBehindForm"') do (
        if %%a gtr 0 ( 
            for /F "tokens=1*delims=[]" %%i in ('^<"%%F" find /n /v ""') do if %%i gtr %%a echo(%%j)>>"%%~nF.vb" 
            for /F "tokens=1*delims=[]" %%i in ('^<"%%F" find /n /v ""') do if %%i lss %%a echo(%%j)>>"%%~nF.fwm" 
    
            :: if the codebehind was found and parsed out, there's a .fwm and .vb file
            :: remove the original
            if exist %%~nF.vb del %%F
        )
    )
    :: change the .fwm extensions back to their original .frm extensions
    ren *.fwm *.frm