【问题标题】:Batchscript can't remove line from text file批处理脚本无法从文本文件中删除行
【发布时间】:2015-04-21 14:05:14
【问题描述】:

我一直在制作一个记录电话号码的小脚本,它工作正常,但我无法让删除功能正常工作,并且出现错误:FINDSTR:无法打开 del 和 FINDSTR:无法打开 /s。

@echo off
:menu
cls
echo ^<^<^<^<^< Test Nisse's phone records ^>^>^>^>^>
echo ^<1^>. Search for phone number
echo ^<2^>. Enter a new phone number
echo ^<3^>. Remove phone number
echo ^<4^>. Print all of the telephone record on the screen
echo ^<x^>. Exit 
set /p val="Enter your selection <1-4, x>: " 
if %val%== 1 goto one
if %val%== 2 goto two
if %val%== 3 goto three
if %val%== 4 goto four
if %val%== x goto x

:one
cls
set /p n1="Number: "
findstr /r /c:%n1% telephoneregister.txt
echo.
echo ====================
SET /p =ENTER to go back to menu.
goto menu

:two
cls
set /p p1="Number: " 
echo %p1% >> telephoneregister.txt
echo. 
echo ====================
set /p =ENTER to go back to menu.
goto menu

:three
cls
echo Which number would you like to delete?
set /p num="Telephoneregister: " 
type telephoneregister.txt | findstr /v %num% > telephoneregister1.txt del /s telephoneregister.txt 
type telephoneregister1.txt > tele.txt del /s tele1.txt 
set /p =ENTER to go back to menu.
goto menu

:four
cls
type telephoneregister.txt
echo.
echo ====================
set /p =ENTER to go back to menu.
goto menu

:x
exit

【问题讨论】:

  • 这是让我想起“创可贴”脚本的那些类型的帖子之一。其中之一是“回到那些”。我喜欢你的问题,我想起了一个帖子/脚本,它实际上不在任何脚本站点上,但确实在新闻组中,并且是 - groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

标签: windows shell batch-file cmd


【解决方案1】:

在 :two 中,您在每个电话号码后写一个空格:

echo %p1% >> telephoneregister.txt

将其更改为:

echo %p1%>> telephoneregister.txt

将:三改为:

:three
cls
echo Which number would you like to delete?
set /p num="Telephoneregister: " 
type telephoneregister1.txt | findstr /v %num% telephoneregister.txt > telephoneregister1.txt 
copy /y telephoneregister1.txt telephoneregister.txt > nul
del telephoneregister1.txt 
set /p =ENTER to go back to menu.
goto menu

“findstr /v”部分会将与数字不匹配的所有行写入您的备份文件(telephoneregister1.txt)。然后我们将该文件复制回telephoneregister.txt(覆盖它)并删除备份文件。

【讨论】:

  • 重定向没有空格的数字可能会出现问题,echo +43 13 45 12 1&gt;&gt; telephone.txt 将删除最后一个 1,因为它被用作流号。最好将重定向放在前面然后&gt;&gt; telephone.txt echo %p1%
  • @jeb:我测试了在脚本中添加一个以 1 结尾的数字并且它不会丢失。
  • 只有在1之前还有空格或不同的分隔符时才会出现
【解决方案2】:

你需要&amp;在一行的命令之间,否则cmd将假定第二个命令是第一个命令的额外参数。

type telephoneregister.txt | findstr /v %num% > telephoneregister1.txt del /s telephoneregister.txt 

应该变成

type telephoneregister.txt | findstr /v %num% > telephoneregister1.txt&del /s telephoneregister.txt 

甚至更简单

type telephoneregister.txt | findstr /v %num% > telephoneregister1.txt
del /s telephoneregister.txt 

或者,更简单

type telephoneregister.txt | findstr /v %num% > telephoneregister1.txt
move /y telephoneregister1.txt telephoneregister.txt >nul

move 命令将用源文件覆盖目标文件。 /y 表示“不提示权限覆盖”,1 file(s) moved 消息通过重定向到 nul 来抑制

【讨论】:

  • 这个对我来说效果最好,非常感谢,也感谢其他人的帮助。
【解决方案3】:

我稍微修改了您的代码,以解决一些小细节,或者使其更简单。这里是:

@echo off
:menu
cls
echo ^<^<^<^<^< Test Nisse's phone records ^>^>^>^>^>
echo ^<1^>. Search for phone number
echo ^<2^>. Enter a new phone number
echo ^<3^>. Remove phone number
echo ^<4^>. Print all of the telephone record on the screen
echo ^<x^>. Exit 
choice /C 1234x /M "Enter your selection: " 
if %errorlevel% equ 5 exit /B
cls
call :option-%errorlevel%
echo.
echo ====================
SET /p =ENTER to go back to menu.
goto menu


:option-1 Search
set /p n1="Number: "
findstr /i /r /c:%n1% telephoneregister.txt
exit /B

:option-2 Enter
set /p p1="Number: " 
set /P "=%p1%" < NUL >> telephoneregister.txt
echo.>> telephoneregister.txt
exit /B

:option-3 Remove
echo Which number would you like to delete?
set /p num="Telephoneregister: " 
findstr /v %num% telephoneregister.txt > telephoneregister1.txt
move /Y telephoneregister1.txt telephoneregister.txt 
exit /B

:option-4 Print
more telephoneregister.txt
exit /B

顺便说一句,您还可以使用完全相同的代码在电话号码后管理姓名;只需“输入数字后跟名称”和“输入数字或名称进行搜索”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多