1

我想编写一个批处理脚本,用户可以在其中输入行号,脚本将删除文本文件的该行。

例如: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% (
                  ????????????????????
    )
)
4

2 回答 2

1

您不能直接修改文件。您必须创建一个包含所需内容的新文件,然后用新文件替换原始文件。

您可以通过重定向输出和回显所需内容来创建新文件。我ECHO(%%b在 %%b 为空的情况下使用,因为该行是空白的。如果 b 为空,ECHO %%b将产生。ECHO is off.大多数人使用ECHO.,但在深奥的条件下可能会失败。ECHO(永远不会失败。

您使用 MOVE 将原始文件替换为新文件。

您可以通过在 FIND 之后使用 FINDSTR 过滤掉不需要的行来消除检查 FOR /F 循环中的数字的需要。

请注意,到目前为止,您的代码将删除每一行的所有前导[]字符。因为线路过滤器是在 FOR 迭代之前应用的,所以您可以通过将 DELIMS 设置为 only 来稍微改善这种情况]

@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
于 2012-10-04T23:12:21.107 回答
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%"
于 2016-05-15T17:15:33.283 回答