这可以作为
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "tokens=1,* delims=]" %%a in ('
find /n /v "" ^< "file1.txt"
') do (
>> "file2.txt" echo(%%b
)
内部find
命令的输出就像
[123]texttexttext
该代码使用右括号作为分隔符,因此标记(我们请求两个标记:1,*
或1*
)是
[123 texttexttext
^ ^
1 2
%%a %%b
但是,由于重复的定界符仅作为一个定界符处理,如果一行以右括号开头,它将被删除。这可以防止为
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "tokens=1,* delims=0123456789" %%a in ('
find /n /v "" ^< "file1.txt"
') do (
set "line=%%b"
setlocal enabledelayedexpansion
>>"file2.txt" echo(!line:~1!
endlocal
)
在这里,数字用作分隔符,并且该行被标记为
[ ]texttexttext
^ ^
%%a %%b
然后将第二个标记的值存储在变量中,禁用延迟扩展以避免数据内部出现感叹号问题(如果延迟扩展处于活动状态,则将由解析器处理/替换)
一旦数据在变量中,延迟扩展被激活(需要一些东西,因为我们想要从代码块内更改的变量中检索内容)以从第二个位置输出行(字符串中的第一个字符为 0)以删除右括号。完成后,延迟扩展将再次禁用。
由于 OP 必须将其合并到更大/复杂的脚本中进行编辑,因此该代码应该面临最常见的问题
@echo off
rem For this test we will have delayed expansion from the start
setlocal enableextensions enabledelayedexpansion
rem External code block that will make delayed expansion necessary
if 1==1 (
rem Variables changed inside block
set "input_file=file1.txt"
set "output_file=file2.txt"
rem Grab a reference to the content of the file variables
for %%i in ("!input_file!") do for %%o in ("!output_file!") do (
rem Prepare the environment for file work
setlocal disabledelayedexpansion
rem Prepare output file
type nul > "%%~fo"
rem Process input file and write to output file
for /f "tokens=1,* delims=0123456789" %%a in ('
find /n /v "" ^< "%%~fi"
') do (
set "line=%%b"
setlocal enabledelayedexpansion
>>"%%~fo" echo(!line:~1!
endlocal
)
rem Restore the previous environment
endlocal
)
)