【问题标题】:Batch variables are broken [duplicate]批处理变量已损坏[重复]
【发布时间】:2016-03-21 06:38:32
【问题描述】:

我正在批量制作聊天室之类的东西。不幸的是,该文件无法存储变量。这是我的代码

@echo off
color b
Title Messanger
:top
echo Are you hosting the chat?
set /p host="Yes or no>"
if /i "%host%"=="yes" (
    set /p port="Port>"
    rem This would normally listen for connections
    echo Listening for connections on port %port%
    pause
 )
if /i "%host%"=="no" (
    echo Who is hosting this chat?
    set /p ip="Ip>"
    set /p port="Port>"
    echo ----------------CHAT----------------
    rem This would normally connect to the ip and port
    echo %ip% %port%
 )
echo Error.
pause
goto top

我不知道你是否得到相同的结果,但只看到没有变量的消息。输出:

Are you hosting the chat?
Yes or no>yes
Port>8080
Listening for connections on port
Press any key to continue . . .

在此之后,它应该会显示回显错误并转到文件的开头

【问题讨论】:

  • 哪个部分不工作?我无法使用 Windows 机器,但如果你告诉我想要的结果和取得的结果,我可能仍然可以提供帮助。是IF 语句失败并且没有采取正确的路线,还是%ip%%port% 没有出现在echo 中?
  • 它是说当变量应该占用输入的值时,它们没有任何值。编辑:刚刚看到评论的编辑。 %ip% 和 %port% 没有出现在 echo 中
  • 所以IF 语句没有正确评估?或者这是有效的,是%ip%%port% 没有出现在echo 中?
  • 也许您可以将输出添加到您的问题正文中。
  • 如果有帮助,我可以添加如果我选择否的输出

标签: batch-file


【解决方案1】:

解决方法有两个:

1) 您需要将setlocal enabledelayedexpansion 添加到脚本的开头。像这样:

@echo off
setlocal enabledelayedexpansion
color b
Title Messanger

(注意第 2 行)

2) 然后,在 IF 块内,您需要使用 ! 而不是 % 来寻址变量,如下所示:

if /i "%host%"=="yes" (
    set /p port="Port>"
    rem This would normally listen for connections
    echo Listening for connections on port !port!
    pause
 )

(注意第 4 行)

说明

因为%ip%%port% 在子句内(即在括号内),所以它们的值在块内的实际代码执行之前被捕获。在解释器进入IF 块之前,它会在执行此操作之前捕获%port% 的值(在它进入实际块之前不存在)。所以,虽然它看起来你的代码正在运行

echo Listening for connections on port %port%

实际运行的是

echo Listening for connections on port 

(注意空格。%port% 被替换为 %port% 的值它进入括号内的块之前 - 这是一个空值。

处理被修改然后在一个块中重复使用的变量的解决方案是启用延迟扩展,然后使用! 符号而不是% 来引用它们。

【讨论】:

  • 感谢您的快速响应!很想看到这个解释。忘了补充,这解决了问题
  • 太棒了!让我知道解释是否有意义或您有任何其他问题。此外,如果解决方案最终正常工作,请随时将其标记为答案。
  • 如果每次有人发布代码无法正常工作的原因是因为扩展延迟的问题,我都能得到一美元,我仍然不会变得更富有,因为我不是美国人,而且我们不要在这里使用美元。
猜你喜欢
  • 2020-09-13
  • 2012-02-17
  • 2018-06-23
  • 2014-01-06
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多