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