我试图在批处理中制作提醒系统,其中有不同的提醒行。我的批处理程序将写入.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
答案 0 :(得分:1)
提示您修复的内容:
>
字符不允许您写入特定行,并且Windows批处理中没有本机支持来执行此类操作。>
字符:>
,将输出重定向到文件(替换任何现有内容),>>
的多个实例,但这无效。 :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行,这对您来说应该不是问题。)
注意:您的输入不应包含!