之前我从未做过批处理文件。我有几十个.txt文件放在一个文件夹中(例如C:\ files)。
所有文件都以6行需要删除的文本结尾。样本将是(注意第一行中的空格):
var...
'ascending';...
'LIT-xxx,LIT-xxx...
setfunction...
0.33...
getdate...
此外,我希望"新"文件覆盖当前文件,以便文件名和目录不会更改。
abs 10.txt
him 4.txt
lab 18.txt
答案 0 :(得分:0)
将原始文件备份到其他备份文件夹,然后运行此脚本:
@echo off
setlocal enabledelayedexpansion
pushd "%temp%\Test"
for %%G in ("*.txt") do (set "break="
(for /f "delims=|" %%H in (%%~G) do (
if not defined break (
echo %%H | findstr /r /b /c:"[ ]*var.*" >nul && set break=TRUE || echo %%H )
)) >> %%~nG_mod.txt
del %%~G & ren %%~nG_mod.txt %%G )
popd
exit /b
它假设:
[any number of spaces]var[any text]
行开始,就像您在问题中发布的那样,任何文件中只有一个此类字符串%temp%\Test
中过滤,并且该目录中没有其他无关文件。答案 1 :(得分:0)
以下代码段完全符合您的要求,从文本文件中删除最后六行:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "FILES=C:\files\*.txt" & rem // (specify file location and pattern)
set /A "LINES=-6" & rem /* (specify number of lines to delete;
rem positive number: delete from begin,
rem negative number: delete from end) */
rem // Standard `for` loop to resolve file pattern:
for %%F in ("%FILES%") do (
rem // Get the count of lines for the current file:
for /F %%N in ('^< "%%~F" find /C /V ""') do set "COUNT=%%N"
rem // Initialise a line index:
set /A "INDEX=-LINES"
rem /* Enumerate all lines of the current file, preserving empty ones
rem by preceding each with a line number, so no line appears empty
rem to the `for /F` loop; the line number is split off later on;
rem in addition, the current file is emptied after being read: */
for /F "delims=" %%L in ('
findstr /N /R "^" "%%~F" ^& ^> "%%~F" break
') do (
rem // Increment index, get text of currently iterated line:
set /A "INDEX+=1" & set "LINE=%%L"
rem // Toggle delayed expansion to preserve exclamation marks:
setlocal EnableDelayedExpansion
rem // Check index value and write to current file conditionally:
if !INDEX! GTR 0 if !INDEX! LEQ !COUNT! (
rem // Split off line number from line text:
>> "%%~F" echo(!LINE:*:=!
)
endlocal
)
)
endlocal
exit /B
此方法不使用临时文件以避免任何名称冲突。但是,由于每个文件都有多个文件写入操作,因此整体性能比将所有数据一次写入临时文件并将其移回原始文件时要差一些。