用Batch写入不同的行

时间:2016-03-29 19:56:13

标签: batch-file

我试图在批处理中制作提醒系统,其中有不同的提醒行。我的批处理程序将写入.txt文件中的不同行,但它不起作用。你能帮忙并试着找到问题吗?

@echo off
echo Enter slot # for reminder
set /p n=
cls
echo Please type in the assignment name
set /p a=
echo ----------------------------------
echo Please type in the class
set /p c=
echo ----------------------------------
echo Please type in the date due
set /p d=
cls
if %n%==1 goto l1
if %n%==2 goto l2
if %n%==3 goto l3
if %n%==4 goto l4
if %n%==5 goto l5
if %n%==6 goto l6
:l1
echo Reminder for %c% Homework! %a%,%d% > Reminder.txt
:end

:l2
echo Reminder for %c% Homework! %a%,%d% >> Reminder.txt
:end

:l3
echo Reminder for %c% Homework! %a%,%d% >>> Reminder.txt
:end

:l4
echo Reminder for %c% Homework! %a%,%d% >>>> Reminder.txt
:end

:l5
echo Reminder for %c% Homework! %a%,%d% >>>>> Reminder.txt
:end

:l6
echo Reminder for %c% Homework! %a%,%d% >>>>>> Reminder.txt
:end

2 个答案:

答案 0 :(得分:1)

提示您修复的内容:

  • >字符不允许您写入特定行,并且Windows批处理中没有本机支持来执行此类操作。
  • 有两个运营商使用>字符:
    >,将输出重定向到文件(替换任何现有内容),
    和{{ {1}},附加(添加到文件的末尾)。
  • 您有>>的多个实例,但这无效。 :end是一个标签,它是代码中该点的唯一引用。当你添加多个时,有些会被忽略,你会得到未定义的行为,这很糟糕。
  • 您似乎正在尝试使用:end退出。请使用:end。它跳转到内置标签goto :EOF,文件结尾的缩写。
  • 您需要处理:EOF不是预定义值的情况。目前,如果有人为n输入了7,那么您的程序将在n之后进入逻辑并运行它,这是错误的。放一个:l1以防万一。


如何通过批处理解决此类问题:
我能想到修改特定行的唯一方法是使用goto :EOF循环迭代所有行,重写每一行(到临时文件),直到遇到你想要的那一行为止更改,然后编写新内容而不是现有内容。然后,当您完成迭代后,您可以用该临时文件替换原始文件。
每次想要更换新线路时都必须这样做。 Batch是一种非常简单的语言,没有像数组这样的有用构造,或者像Bash这样的shell脚本语言会有许多外部工具。它还有一些非常简单的运行时评估

这是一个部分解决方案,您可以结合上面代码中的几行来实现您想要的效果。它会提示您输入行号,然后将for /f变量的内容(替换为您的实现)放入指定行的文件中:

newContent

您可以在顶部替换几行,获得您想要的功能。

答案 1 :(得分:0)

您无法批量写入文件中的特定行。相反,你必须重写完整的文件。

步骤:a)读取文件。 b)改变所需的线。 c)(over)用新数据写入文件。

@echo off
setlocal enabledelayedexpansion
if not exist reminder.txt call :InitFile    :: create the file, if it doesn't exist
set /p "n=Enter slot # for reminder: "
set /p "a=type in the assignment name: "
set /p "c=type in the class: "
set /p "d=type in the date due: "
cls

call :ReadFile   
set "_Line[%n%]=Reminder for %c% Homework: %a%,%d%" 
call :WriteFile  
type Reminder.txt
goto :eof

:ReadFile
set x=0
for /f "delims=" %%i in (reminder.txt) do (
  set /a x+=1
  set "_Line[!x!]=%%i"
)
goto :eof

:WriteFile
set x=0
(for /f "tokens=2 delims==" %%i in ('set _Line[') do echo %%i)>Reminder.txt
goto :eof

:InitFile
(for /l %%i in (1,1,6) do echo Reminder %%i [empty])>Reminder.txt
goto :eof

(注意:由于使用set _line[按字母顺序排序,这会产生超过9行的问题,但由于您只需要6行,这对您来说应该不是问题。)

注意:您的输入不应包含!