【问题标题】:How to make the SET command not wait for answer?如何使 SET 命令不等待应答?
【发布时间】:2014-06-05 16:03:39
【问题描述】:

我制作了一个聊天程序,效果很好,唯一的问题是 SET /P 命令会等到你按下某个东西然后按下 ENTER 键。我的代码有问题:

:CHAT
CLS
SET TEXT=
TYPE "%FILESDIR%\Files\CHAT.cht" << I need this line active all the time.
ECHO.
SET /P TEXT=Text: 
IF NOT "%TEXT%"=="" ECHO %USERNAME%: %TEXT% >> "%FILESDIR%\Files\CHAT.cht"
PING LOCALHOST -n 1 > nul
GOTO CHAT

我想一直更新 TYPE 命令,但你需要输入一些东西。无论如何我可以解决这个问题吗? 编辑:我真的不想要另一个 cmd 屏幕

【问题讨论】:

    标签: batch-file batch-updates


    【解决方案1】:

    假设您确实有连续实时更新文本。当用户开始输入文本,然后另一个用户同时发送要显示的文本时会发生什么。你只有一个窗口 - 所以你会弄得一团糟(假设你能弄清楚如何在技术上实现它)。

    你离拥有一个功能性的聊天程序还有很长的路要走——你还没有完全考虑清楚问题所在。

    1) 你需要两个独立更新的窗口:

    • 用户可以输入文本的输入窗口

    • 一个实时显示所有参与者正在运行的对话的对话窗口。

    Windows 批处理不支持多个窗口。但是您可以通过为每个用户运行两个批处理来模拟它,一个用于输入,另一个用于对话框输出。单个批处理脚本可用于这两个进程。父脚本可以使用 START 命令启动多个批处理。每个批处理都会有自己的控制台窗口。

    2) 一次只有一个人(进程)可以写入文本文件。如果两个人同时尝试写作,你认为会发生什么?一个会成功,另一个会失败。您需要一种方法来检测失败并自动重试直到成功。我在How do you have shared log files under Windows? 描述了一个简单的方法来实现这一点。

    3) 如果用户在没有输入任何内容的情况下按下&lt;Enter&gt;,SET /P 将简单地返回上一个条目。您应该在 SET /P 语句之前清除文本变量。 编辑 - 我现在看到 OP 已经在一个我没想到的地方有了这个

    4) 您不想在每次有更新时从头重新键入整个对话框。您只想显示新添加的行。可以将输入重定向到一个无限的 FOR /L 循环,并且在循环中您可以使用 SET /P 来读取最近的行。如果没有附加任何内容,则它将不返回任何内容(假设变量在 SET /P 之前被清除)。如果没有收到任何内容,您根本不会 ECHO 任何内容。

    这是一个演示上述概念的非常粗略的工作示例。没有办法退出程序。您必须关闭两个控制台窗口才能退出。

    @echo off
    setlocal enableDelayedExpansion
    set "dialog=dialog.txt"
    if "%~1" equ ":input" (
      title Chat Input
      goto :input
    )
    start "" "%~f0" :input
    title Chat Dialog
    
    ::Show Dialog
    <"%dialog%" (  for /l %%N in () do (
      set "text="
      set /p "text="
      if defined text echo(!text!
    ))
    
    
    :input
    cls
    set "text="
    set /p "text=>"
    :write
    2>nul (
      >>"%dialog%" (
        echo(%username%: !text!
        (call )
      ) || goto :write
    )
    goto :input
    

    要成为真正有用的聊天程序还有很长的路要走。但这是一个很好的起点。一些额外的东西仍然可以添加。

    5) 一种为每个独立聊天启动新对话文件的方法。

    6) 一种邀请一个或多个用户加入聊天的方式。

    7) 退出程序的干净方式,包括关闭附加控制台窗口。这需要进程间通信。我在http://www.dostips.com/forum/viewtopic.php?t=4741 的 SNAKE.BAT 游戏中演示了这一点。警告 - 该脚本中有很多高级概念,因此提取相关信息可能是一个挑战;-)

    8) 如果对话框窗口有一个可滚动的显示缓冲区,那就太好了。用户可以通过控制台属性控制缓冲区的大小,但最好以编程方式控制它。本机批处理无法做到这一点,但我在 CMD: Set buffer height independently of window height 展示了混合 PowerShell/批处理如何做到这一点

    【讨论】:

    • 所以我只会在我家使用这个程序,所以你不需要做那么复杂,但我真的想把所有东西都放在一个批处理文件中,有没有你可以帮助我?此外,此代码:SET TEXT= 清除文本,这样您就不会发送垃圾邮件,如果您不知道的话。
    • @ThE_Kill3r - 很好,您不需要完善的解决方案。但是,无论您使用哪种解决方案,我的回答中的第 1、2 和 3 点都至关重要。如果不解决这些问题,我不知道如何提供解决方案,我已经为您提供了一个成功解决这些问题的批处理解决方案。
    • 我会在稍后解决这些问题,但首先我真的想先解决基本的聊天问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多