我希望找到一个批处理或VBS解决方案来删除程序生成的文本文件中的行,扩展名为.trs。
在创建的每个.trs文件中都有一行包含“劳动”一词。我需要删除包含单词labor的行之后的每一行。
.trs文件全部存储在c:\ export
中我已经搜索过这个但是有些命令完全超出了我的想法。请有人帮我提供整批文件的剪切和粘贴。
答案 0 :(得分:3)
我相信这是您要查找的代码(在批处理文件中),以删除单词“labor”上方的所有行。如果需要对代码进行修改(例如文件中是否存在多个“人工”实例),请告诉我。
@echo OFF
setLocal EnableDelayedExpansion
cd C:\export
for /f "delims=" %%I in ('findstr /inc:"labour" "test.trs"') do (
set /A"line=%%I"
)
set count=0
for /f "delims=" %%A in (test.trs) do (
If !count! GEQ %line% goto ExitLoop
echo %%A >>temp.txt
set /A count+=1
echo !count!
)
:ExitLoop
type temp.txt > test.trs
del temp.txt
endlocal
输出:
test.trs(更改前)
this
is
a
labour
test
of
the
results
test.trs(更改后)
this
is
a
答案 1 :(得分:3)
以下是处理“C:\ export”中每个.trs文件的另一种方法:
@echo off
if not exist "C:\export\*.trs" goto :EOF
if exist "C:\export\queue.tmp" del /q "C:\export\queue.tmp"
for /f "tokens=*" %%A in ('dir /b "C:\export\*.trs"') do (
for /f "tokens=1,2 delims=:" %%B in ('findstr /inc:"labour" "C:\export\%%A" ^| findstr /n .*') do if "%%B" equ "1" set LineNumber=%%C
for /f "tokens=1* delims=:" %%D in ('findstr /n .* "C:\export\%%A"') do if %%D lss %LineNumber% echo.%%E>>"C:\export\queue.tmp"
move /y "C:\export\queue.tmp" "C:\export\%%A">NUL
)
首先,我做了一些错误检查,以避免会破坏脚本的事情。接下来,我提取存储在 C:\ export 中的 .trs 文件列表,并遍历每个文件。
我使用' findstr / inc:“labor”“C:\ export \ %% A”'来获取当前文件中找到“labor”的行号,然后将其管道化进入“ findstr / n。* ”,以便在找到多个匹配项时对结果进行编号。
然后我使用for循环“ tokens = 1,2 delims =:”来查找第一个结果(如果“%% B”等于“1” )并存储行号(设置LineNumber = %% C )。
接下来,我使用' findstr / n。*“C:\ export \ %% A”'来读取文件的每一行,“tokens = 1 * delims =: “再次分隔行号,然后将所有数据复制到临时文件,直到达到%LineNumber%。这种读取文件的方法(使用findstr和编号行)也确保for循环不会跳过任何空白行。
最后,我用temp文件替换原始文件,然后循环到下一个文件。
我试图尽可能减少上面的代码。这是与格式,注释,视觉反馈和用户可定义变量相同的脚本:
@echo off
::Set user-defined Variables
set FilePath=C:\export
set FileType=*.trs
set Keyword=labour
::Check for files to process and exit if none are found
if not exist "%FilePath%\%FileType%" echo Error. No files to process.&goto :EOF
::Delete temp file if one already exists
if exist "%FilePath%\queue.tmp" del /q "%FilePath%\queue.tmp"
::List all files in the above specified destination, then process them one at a time
for /f "tokens=*" %%A in ('dir /b "%FilePath%\%FileType%"') do (
::Echo the text without a line feed (so that "Done" ends up on the same line)
set /p NUL=Processing file "C:\export\%%A"... <NUL
::Search the current file for the specified keyword, and store the line number in a variable
for /f "tokens=1,2 delims=:" %%B in ('findstr /inc:"%Keyword%" "%FilePath%\%%A" ^| findstr /n .*') do (
if "%%B" equ "1" set LineNumber=%%C
)>NUL
::Output all data from the current file to a temporary file, until the line number found above has been reached
for /f "tokens=1* delims=:" %%D in ('findstr /n .* "%FilePath%\%%A"') do (
if %%D lss %LineNumber% echo.%%E>>"%FilePath%\queue.tmp"
)>NUL
::Replace the current file with the processed data from the temp file
move /y "%FilePath%\queue.tmp" "%FilePath%\%%A">NUL
echo Done.
)