我制作批处理文件已有大约半年了,但从来没有遇到过这个问题,而且我使用的任何方法都不起作用,我使用的是 Windows 10 x64 位,如果这能改变什么的话。这是以下脚本:
@echo off
title The Battling Simulator [TBS] - Nickname Selection
cls
:name
cls
if exist "%name%" (
goto welcomeback
) else (
goto createname
)
:welcomeback
echo fire server
pause
:createname
set /p name=Name :
echo name created
echo test > %name%
pause
问题是,正如您在批处理文件脚本中看到的,我希望程序检查您是否已经输入过一次名称,因此它会通过创建文件永久记住该名称,因此如果我将自己命名为“Axel”,它将在我的桌面上创建一个名为“Axel”的文件,如果该文件已经存在,它应该转到“welcomeback”部分,但它并没有这样做,而是转到 createname 部分。如果尚未输入名称并且您是该程序的新用户,那么它会询问您的姓名,之后它将创建一个包含您姓名的文件并将其记住在您的桌面上,然后您将尝试重新进入该程序,它应该会让您转到 welcomeback 类别。
更简短地说,它忽略了“:welcomeback”类别,它只通过检查是否已创建了以您的名字命名的文件来转到“:createname”。我真的需要帮助,因为这种情况从未发生在我身上。
真诚的,迈克。
答案1
标签:name
没有效果。(标签根本没用。)如果你想要将标签作为注释,那么如果有第二个冒号,命令解释器实际上会运行得更快一些。(例如,::name
)这是注释某些内容的最快方式(甚至比命令还快REM
),并且向人们清楚地表明标签不是你GOTO
在任何时候尝试的东西。(你不能使用GOTO
以附加冒号开头的标签,该冒号紧跟在第一个强制冒号之后。)
如果存在文件名为的文件%name%
,那么这似乎会转到:welcomeback
然后,在:welcomeback
标签之后,批处理文件应该echo fileserver
,然后转到下一行。
然后它应该暂停。
然后,批处理文件应该继续到下一行,即标签:createname
,这没有任何影响(除非批处理文件正在寻找该标签以便转到它)。
然后,批处理文件继续下一行,提示输入名称。
set /p name=Name :
尝试这个:
@echo off
title The Battling Simulator [TBS] - Nickname Selection
cls
if exist "%NAME%" GOTO welcomeback
GOTO createname
:welcomeback
:: Got here because %name% existed.
echo fire server
pause
goto end
:createname
set /p NAME=Enter your name :
echo name created (%NAME%)
echo test > %NAME%
pause
:: (Next, falls through to the :end label)
:end
答案2
您需要:end
在末尾添加一个,并goto :end
在“欢迎”部分的末尾添加一个,这样它就不会继续下去。所以我只是将这两行添加到您的程序中。
@echo off
title The Battling Simulator [TBS] - Nickname Selection
cls
:name
cls
if exist "%name%" (
goto welcomeback
) else (
goto createname
)
:welcomeback
echo fire server
pause
goto :end
:createname
set /p name=Name :
echo name created
echo test > %name%
pause
:end
这是一个标准的设计模式,批量使用 GOTO,例如这里提到的https://www.robvanderwoude.com/goto.php 看到每个标签的设计都有一些代码并以 结尾goto End
。这是 goto 的良好用法,非常清晰。
人们还可以使用 GOTO 做其他事情,例如获得迭代的效果(现在实际上并没有这样做),或者获得子程序的效果(现在也没有太多这样做,有'call'关键字更适合产生子程序效果,它执行 goto 并返回到调用它的地方。
也许您从未遇到过过去遇到的问题,因为过去您通常在最后会有一个 GOTO 的标签,而后面没有标签。
另外,正如一个答案所提到的,您没有使用:name
即您没有在其上执行 GOTO,因此您也可以删除该标签。
答案3
您的示例并未说明将 name 定义为变量。执行此操作的方法是创建一个用户目录,并将用户存储为 name.txt、name.sav 或 name.bat 文件(如果您保存用户信息)。
我建议在任何想要恢复信息的情况下使用 bat 文件,因为您可以以允许调用该文件的方式将信息存储在其中,以重新分配用户需要的任何变量。
这种方法很容易方便多个用户,通过执行以下操作
@ECHO OFF
::: The below line assigns the Directory path your Program is in to the variable
::: for later use
Set Program_DIR=%~dp0
::: This creates the Directory for your User files
IF NOT EXIST "%Program_DIR%\Users" MD "%Program_DIR%\Users"
:login
cls
ECHO Welcome!
Set /p name=[Enter your Username to continue:]
IF not defined name GOTO login
IF Exist "%Program_DIR%\Users\%name%.bat" (
CALL "%Program_DIR%\Users\%name%.bat"
) else (
GOTO New_User
)
:programMENU
::: Your program
:New_User
::: Save the users Name, and Assign the file to Variable to CALL when you wish to
::: store/Retrieve.
ECHO 0>"%Program_DIR%\Users\%name%.bat"
Set "LoadSave=%Program_DIR%\Users\%name%.bat"
使用相对于程序所在文件夹的路径将确保文件夹移动时不会出现断开的链接,并消除了对它位于哪个目录路径的任何猜测。