我想编写一个批处理脚本,用户可以在其中输入行号,脚本将删除该行文本文件。
例如:tmp.txt
1. aaa
2. bbb
3. ccc
4. ddd
我想在执行脚本和用户输入3时,tmp.txt为
1. aaa
2. bbb
4. ddd
我正在尝试这样的事情:
@ECHO OFF
SET /P LINENUMBER=Enter the Line No:
FOR /F "tokens=1* delims=[]" %%a IN ('FIND /n /v "" ^< tmp.txt') DO (
IF %%a equ %LINENUMBER% (
????????????????????
)
)
答案 0 :(得分:1)
您无法直接修改文件。您必须使用所需内容创建一个新文件,然后用新文件替换原始文件。
您可以通过重定向输出和ECHOing所需内容来创建新文件。我使用ECHO(%%b
以防%% b为空,因为该行为空。如果b为空,ECHO %%b
将生成ECHO is off.
。大多数人使用ECHO.
,但在深奥的条件下可能会失败。 ECHO(
永远不会失败。
使用MOVE将原始文件替换为新文件。
您可以在FIND之后使用FINDSTR过滤掉不需要的行,从而无需检查FOR / F循环中的数字。
请注意,到目前为止,您的代码将从每行中删除任何前导[
和]
个字符。由于在FOR迭代之前应用了行过滤器,因此您可以通过将DELIMS设置为]
来略微改善这种情况。
@ECHO OFF
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
FOR /F "tokens=1* delims=]" %%a IN (
'FIND /n /v "" ^<tmp.txt^|FINDSTR /VLB "[%LINENUMBER%]"'
) DO ECHO(%%b
)
>nul MOVE /y tmp.txt.new tmp.txt
如果您的任何原始行已经以]
开头,那么您可以使用FINDSTR而不是FIND来引入行号。这使用nn:
格式而不是[nn]
。此解决方案将从您的行中删除前导:
。
@ECHO OFF
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
FOR /F "tokens=1* delims=:" %%a IN (
'FINDSTR /n "^" tmp.txt^|FINDSTR /VLB "%LINENUMBER%:"'
) DO ECHO(%%b
)
>nul MOVE /y tmp.txt.new tmp.txt
如果您的文本文件包含以:
和]
开头的行,则您无法使用FOR / F来解析行号。而是使用搜索和替换。在循环内打开和关闭延迟扩展,以保护文件中可能存在的任何!
。
@ECHO OFF
setlocal disableDelayedExpansion
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
FOR /F "delims=" %%a IN (
'FINDSTR /n "^" tmp.txt ^| FINDSTR /VLB "%LINENUMBER%:"'
) DO (
set "ln=%%a"
setlocal enableDelayedExpansion
echo(!ln:*:=!
endlocal
)
)
>nul MOVE /y tmp.txt.new tmp.txt
答案 1 :(得分:1)
试试这个:
@echo off & setlocal
set "InFile=Z:\Text.txt"
set "OutFile=Z:\Erg.txt"
set /p LineToDelete=
if exist "%OutFile%" del "%OutFile%"
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"^|findstr /b "%LineToDelete%:"') do findstr /v /b /c:"%%j" "%InFile%">>"%OutFile%"