Предположим, вы постоянно обновляли текст в режиме реального времени. Что происходит, когда пользователь начинает вводить текст, а затем другой пользователь отправляет текст для отображения в то же время. У вас есть только одно окно, поэтому вы получаете беспорядочный беспорядок (при условии, что вы можете понять, как это сделать технически).
Вам далеко до функциональной программы чата - вы не до конца продумали вопросы.
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