如何使SET命令不等待应答



我做了一个聊天程序,它工作得很好,我唯一的问题是SET/p命令将等待,直到你按下某些东西,然后按ENTER。这是我的代码,我有问题:

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

我想随时更新TYPE命令,但是你需要输入一些东西。有什么办法能让我避开这个吗?编辑:我真的不想要另一个cmd屏幕

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

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

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

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

  • 对话框窗口,实时显示所有与会者正在运行的对话框。

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

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

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

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

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

@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)如果对话框窗口有一个可滚动的显示缓冲区就好了。用户可以通过控制台属性控制缓冲区的大小,但最好以编程方式控制它。本地批处理不能做到这一点,但我展示了混合PowerShell/批处理如何在CMD下做到这一点:设置缓冲区高度独立于窗口高度

最新更新