【问题标题】:Batch files always crash when entering a space批处理文件输入空格时总是崩溃
【发布时间】:2013-12-28 00:55:51
【问题描述】:

我一直在编写批处理文件来模拟某种游戏,但在进入和提交空间时它总是崩溃(或简单地关闭)或根本没有。我怎样才能解决这个问题?示例:

set /p option=Option: 

那么我会:

Option: 

我需要输入一些东西,但在这种情况下,如果我在不输入任何内容(或空格)的情况下按 Enter 键,它会自行关闭。

=== 编辑 ===

完整代码在这里:

@echo off
cd Desktop
md TestFolder
goto main

:main
cls
title Test
echo.
echo Enter your name below
echo.
set /p name=Name:
if %name% == %name% set name=%name% & goto finish

:finish
echo.
echo Thank you for entering your name.
echo Press any key to close the window.
pause >nul
exit

问题在于“set /p name=”,因为批处理提示您输入您的姓名(“名称:”部分),如果您在没有输入任何内容的情况下按 Enter,它将关闭。

【问题讨论】:

  • 我们应该如何提供帮助?你展示了一行永远不会崩溃的代码。查看失败的代码可能很有用
  • 是的,这就是代码,其实每一个类似这样的代码都会崩溃。

标签: windows batch-file crash space


【解决方案1】:

这是造成麻烦的那一行:

if %name% == %name% set name=%name% & goto finish

如果您只是在set /p name=Name: 处按回车,%name% 将为空。 所以上面的行将执行为:

if == set name= & goto finish

当然,这永远行不通 要使语法正确,请使用:

if "%name%" == "%name%" set name=%name% & goto finish

好的,这是语法部分。 但你想做什么?如果 a 等于 a 那么使 a = a ??

【讨论】:

  • 如果 a 等于 a 则使 a = a ??是的,你永远无法确定。由于 #define a b 在 C++ 中是可能的,因此您需要仔细检查 :-)
  • 请注意,& 之前的space 将包含在name 变量中。消除这种情况的一种方法是使用 set "name=%name%" 中的引号或将 & 直接放在变量之后,如 set name=%name%& 中的
  • 感谢大家的回答,我也想将此标记为我的答案,但不幸的是,我们只能标记一个。那我会投票赞成你的答案,因为我标记为答案的答案回答了我主要想做的事情。谢谢大家!
【解决方案2】:

你几乎没有给我们任何东西,但我会做出一个有根据的猜测。如果您通过在桌面或 Windows 资源管理器中双击文件(或快捷方式)来运行该文件,那么当程序到达终点时您的控制台将自动关闭。终点可能是由于您的代码逻辑,也可能是由于致命的语法错误。它会在您有机会阅读打印的任何消息之前关闭。

解决方案是改变游戏运行方式,尤其是在开发过程中。通过转到开始->所有程序->附件并选择 cmd.exe 直接运行控制台。使用CD 导航到您的游戏所在的文件夹,然后输入批处理文件的名称以运行它。现在游戏结束时控制台将保持打开状态,您将能够更轻松地查看所有消息并进行调试。

【讨论】:

    【解决方案3】:

    也许这就是你所追求的。

    IF NOT DEFINED name GOTO main 行检查用户是否只是按下了 Enter 键而没有输入任何内容,如果是,则返回到 :main 标签并再次提示用户输入名称。

    IF "%name%"==" " GOTO main 行检查用户是否刚刚输入了 1 个space 字符,如果是,则返回:main 标签也再次提示用户。

    :main
    cls
    title Test
    echo.
    echo Enter your name below
    echo.
    set /p name=Name:
    IF NOT DEFINED name GOTO main
    IF "%name%"==" " GOTO main
    
    :finish
    echo.
    echo Thank you for entering your name.
    echo Press any key to close the window.
    pause >nul
    exit
    

    【讨论】:

    • 谢谢你,它工作得很好,现在批处理永远不会关闭,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多