繁体   English   中英

从另一个批处理中启动时,批处理文件的行为有所不同

[英]batch file acts differently when launched from within another batch

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

我的代码,因为某些原因变得非常搞砸是波纹管,你可以看到一个更好的版本在这里

@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

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

有人有想法么?

ek! 请把我的大瓶阿司匹林交给我!

Ansgar似乎已对原始文件进行了编辑,以匹配pastebin版本-如果是正确的话,则该例程似乎无法工作-调用还是不执行...

这条线

:no EXIT /B

将无法正常工作。 标签行上的所有数据都将被忽略,因此无法EXIT该过程。 MUST写成

:no
EXIT /B

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

因此,

GOTO no

是多余的。 除非ANSWERyyes no将到达标签no-并且GOTO yes周围的括号也是多余的。

下一个小问题是响应SET/P仅按ENTER不会更改变量的值-它将保留set/p之前的任何值。

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

解决此问题的方法是在执行set/p之前专门设置值

SET "ANSWER="
SET /P ANSWER=

但是,这经常是两条路。 如果您编码

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

然后SET/P将以[Y]提示-注意,此处仅需使用引号将空格括起来。 不需要空间吗? 省略引号...

现在,这对于输入name和-哦-哦-另一个陷阱可能更为重要。 datetime是所需变量的逻辑名称。 问题是,它们太合逻辑了。 它们是magic variables -最好不要弄乱它们。

如果未设置任何magic variable则可以在批处理程序中将其设置为与普通变量BUT相同的设置,系统会将它们设置为-魔术值。 当然是靠魔术。 %date%包含日期, %time%包含时间-还有很多其他内容-请参阅SET /? 从提示列表中。

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

目前,该系统初始化的变量之一是path -即获得搜索以找到一个execuable如果没有明确的路径是由目录的列表,它不是在当前目录中。

关于%0\\..\\构造,最后一点很重要。 %0 ”本身就是批处理文件名。 它可能是fredfred.batC:\\somewhere\\somewhereelse\\fred.bat根据情况有很多不同的东西。 %0\\..\\file.txt可能有所不同-当前目录中的file.txt最有可能。

因此-您的原始批处理将检查file.txt是否在当前目录中存在,然后注释Erase the file%0\\..\\file.txt如果Erase the file已经存在)-可能会写入.\\file.txt (即file.txt当前目录中的file.txt )-因此它会覆盖现有文件。

无论如何,例程随后会询问三个数据项并使用此特殊的构造

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

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

然后,提示您输入另一个条目,这次是在文件中追加( >> )。

如果deleted任何现有文件,然后appended所有数据行appended到一个新文件,这将更加简单- >>将创建一个文件(如果尚不存在)。

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

请注意我如何设置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

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

替换为:

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

有了这个:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM