0

所以...嘿伙计们。我有最奇怪的问题。我写了这个生成文本文件的批处理文件

我的代码由于某种原因变得非常混乱,如下所示,你可以在这里看到更好的版本

@ECHO OFF

IF NOT EXIST file.txt goto generate
ECHO Erase the file>%0\..\file.txt

:generate
ECHO.
ECHO.
ECHO generating Table file for you
ECHO Please enter a name: 
SET /P name=

ECHO.

ECHO Please enter the date: 
SET /P date=

ECHO.

ECHO Please enter the time: 
SET /P time=

ECHO. 
ECHO.
ECHO Huzzah!

ECHO |set /p =%name%        %date%       %time%>%0\..\file.txt

:repeat
ECHO Do you want to add another entry? (Y/N) 
SET /P answer=
IF /i {%ANSWER%}=={y} (GOTO yes) 
IF /i {%ANSWER%}=={yes} (GOTO yes)
GOTO no

:no EXIT /B

:yes
ECHO.
ECHO.

ECHO Please enter a name: 
SET /P name=

ECHO.

ECHO Please enter the date: 
SET /P date=

ECHO.

ECHO Please enter the time:
SET /P time=

ECHO.
ECHO.
ECHO Huzzah!

ECHO.>>file.txt 
ECHO |set /p =%name%        %date%        %time%>>%0\..\file.txt
GOTO repeat

它有效!这是故障,我不想只运行这个文件,我想从另一个文件中运行它。

Sooooo 在我的另一个 .bat 中我有这条线

@call %0\..\generate_file.bat

再次它工作得很好,调用它,运行它,如果我只有一个条目,那么一切都很好......但是如果我输入是并进入另一个条目它不会创建一个新行它只是继续附加旧条目上的新条目。如果我只是自己启动 generate_file.bat ,它会按预期工作。

有人有想法么?

4

2 回答 2

1

哎呀!请把我的大瓶阿司匹林递给我!

Ansgar 似乎已经编辑了原始版本以匹配 pastebin 版本 - 如果这是正确的,那么这个例程似乎没有办法工作 - 调用或不......

这条线

:no EXIT /B

不会工作。标签行上的任何数据都会被忽略,因此无法EXIT执行该过程。这MUST可以写成

:no
EXIT /B

下一个小问题是上一行。与 PASCAL 或 DELPHI 等语言不同。批处理只是逐行执行,直到它到达一个CALLGOTO EXIT或END-OF-FILE。在功能或过程的意义上,它没有任何“块”的概念。标签只是标记。

因此,

GOTO no

是多余的。除非是或-no否则将到达标签,并且围绕的括号也是多余的。ANSWERyyesGOTO yes

下一个小问题是,仅仅ENTER响应 aSET/P不会改变变量的值——它会保留它之前的任何值set/p

结果将是应该answer设置为y,然后响应enteranswer设置为y- 它不会清除answer

克服这个问题的方法是在执行之前专门设置值set/p

SET "ANSWER="
SET /P ANSWER=

但是,正如经常发生的那样,这是一条双向街道。如果你编码

SET "ANSWER=Y"
SET /P ANSWER="[%ANSWER%] "

然后SET/P会提示[Y]- 注意这里只需要引号来包围空格。不想要空间?省略引号...

现在这对于进入name和 - 哦 - 哦 - 另一个陷阱可能更重要。date并且time是您想要的变量的逻辑名称。问题是,它们太合乎逻辑了。他们是magic variables——最好不要惹他们。

Anymagic variable可以在批处理程序中设置,就像普通变量一样,但是如果它们未设置,系统会将它们设置为 - 好吧,魔法值。当然是魔法。%date%包含日期、%time%时间——还有很多其他的——SET /?从提示中查看列表。

魔术变量的问题在于它们没有出现在您从执行中获得的系统初始化变量列表中SET(没有参数!)更改这些也不是一个好主意。批处理程序通常会采用它们的值。

现在系统初始化的变量之一是path- 如果没有明确路径并且它不在当前目录中,则搜索目录列表以查找可执行文件。

最后一点对于建筑来说很重要%0\..\。“ %0”本身就是批处理文件名。根据情况,它可能是fredfred.batC:\somewhere\somewhereelse\fred.bat- 许多不同的东西。%0\..\file.txt因此可能是不同的东西——file.txt在当前目录中是最有可能的。

所以 - 你的原始批次检查是否存在于file.txt当前目录中,然后评论它是否已经存在 - 可能是(即在当前目录中) - 所以它会覆盖现有文件。Erase the file%0\..\file.txt.\file.txtfile.txt

无论如何,例程随后会要求三个数据项并使用这个特殊的结构

ECHO |set /p =%name%        %date%       %time%>%0\..\file.txt

它只是没有响应任何变量,而是提示指向文件的数据行 - 创建一个新文件或覆盖(再次)现有文件(单个>意味着“在新文件中”)

然后提示您输入另一个条目,这次是 APPENDING ( >>) 到文件。

deleted如果您有任何现有文件,那么将appended所有数据线都放到一个新文件中会简单得多- 如果>>文件尚不存在,则 a 将创建一个文件。

所以 - 这是一个部分修订。我没有删除多余的括号和GOTOs,也没有清除或预设SET /Ps 之前的数据值或将提示合并到其中。我什至留下了变量名。

请注意我是如何设置filename的 - 设置一次,以便变量%filename%可以用于文件,而不是不断重复相同的字符串 - 如果您决定更改文件名会很痛苦......

@ECHO OFF
SET filename=%~dp0%file.txt
ECHO %filename%

IF NOT EXIST %filename% goto generate
ECHO Erase the file %filename%
DEL %filename%

:generate
ECHO.
ECHO.
ECHO generating Table file for you

:yes
ECHO Please enter a name: 
SET /P name=

ECHO.

ECHO Please enter the date: 
SET /P date=

ECHO.

ECHO Please enter the time: 
SET /P time=

ECHO. 
ECHO.
ECHO Huzzah!

ECHO(%name%        %date%       %time%>>%filename%

:repeat
ECHO Do you want to add another entry? (Y/N)
SET /P answer=
IF /i {%ANSWER%}=={y} (GOTO yes) 
IF /i {%ANSWER%}=={yes} (GOTO yes)
GOTO no

:no 
EXIT /B

希望你觉得这个有用!我要去躺下。

于 2013-06-11T05:54:28.153 回答
0

替换这个:

ECHO |set /p =%name%        %date%        %time%>>%0\..\file.txt

有了这个:

>>"%~dp0\file.txt" echo %name%        %date%        %time%

%0是脚本文件本身。使用%~dp0\file.txt而不是%0\..\file.txt访问同一文件夹中的文件。将路径放在双引号之间以避免由于意外空格而导致的意外。并将重定向放在命令之前以避免奇怪的输出重定向问题,例如您观察到的问题。

于 2013-06-10T22:12:29.493 回答