Как заставить команду SET не ждать ответа?

Я сделал чат-программу, и она отлично работает, единственная проблема, которая у меня есть, это то, что команда 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


person Community    schedule 05.06.2014    source источник


Ответы (1)


Предположим, вы постоянно обновляли текст в режиме реального времени. Что происходит, когда пользователь начинает вводить текст, а затем другой пользователь отправляет текст для отображения в то же время. У вас есть только одно окно, поэтому вы получаете беспорядочный беспорядок (при условии, что вы можете понять, как это сделать технически).

Вам далеко до функциональной программы чата - вы не до конца продумали вопросы.

1) Вам нужно два окна, которые обновляются независимо:

  • Окно ввода, в котором пользователь может вводить текст

  • Диалоговое окно, отображающее текущий диалог всех участников в режиме реального времени.

Пакет Windows не поддерживает несколько окон. Но вы можете эмулировать это, запустив два пакетных процесса для каждого пользователя, один для ввода, другой для диалогового вывода. Для обоих процессов можно использовать один пакетный сценарий. Родительский сценарий может запускать несколько пакетных процессов с помощью команды START. Каждый пакетный процесс получит свое окно консоли.

2) Только один человек (процесс) может одновременно писать в текстовый файл. Как вы думаете, что произойдет, если два человека попытаются написать одновременно? Один добьется успеха, а другой потерпит неудачу. Вам нужен метод для обнаружения сбоя и автоматической повторной попытки до тех пор, пока не будет достигнут успех. Я описываю простой способ добиться этого в разделе Как у вас есть общие файлы журналов в Windows?.

3) SET /P просто вернет предыдущую запись, если пользователь нажмет <Enter>, ничего не набрав. Вы должны очистить текстовую переменную перед оператором SET/P. EDIT - теперь я вижу, что в 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) Чистый способ выхода из программы, включая закрытие дополнительного окна консоли. Это требует межпроцессного взаимодействия. Я демонстрирую это в своей игре SNAKE.BAT на http://www.dostips.com/forum/viewtopic.php?t=4741. Предупреждение — в этом скрипте много продвинутых концепций, поэтому извлечение соответствующей информации может оказаться сложной задачей ;-)

8) Было бы неплохо иметь диалоговое окно с прокручиваемым буфером отображения. Пользователь может управлять размером буфера через свойства консоли, но было бы неплохо управлять им программно. Собственный пакет не может этого сделать, но я показываю, как гибридный PowerShell/пакет может сделать это в CMD: установка высоты буфера независимо от высоты окна

person dbenham    schedule 05.06.2014
comment
Так что я буду использовать эту программу только у себя дома, поэтому вам не нужно делать это так сложно, но я действительно хочу, чтобы все было в пакетном файле, вы все равно можете мне помочь? Также этот код: SET TEXT= очищает текст, чтобы вы не могли спамить, если вы не знали. - person ; 06.06.2014
comment
@ ThE_Kill3r - Хорошо, вам не нужно идеальное решение. Но пункты 1, 2 и 3 в моем ответе имеют решающее значение, независимо от того, какое решение вы используете. Я не знаю, как предоставить решение, не обращая внимания на эти моменты, и я дал вам пакетное решение, которое успешно решает их. - person dbenham; 06.06.2014
comment
Я, конечно же, исправлю эти проблемы позже, но сначала я действительно хочу исправить основной чат. Спасибо за вашу помощь! - person ; 06.06.2014