テキストをリアルタイムで継続的に更新したとします。ユーザーがテキストの入力を開始し、他のユーザーが同時に表示するテキストを送信するとどうなりますか。ウィンドウが 1 つしかないため、ごちゃごちゃになります (技術的にそれを実現する方法を理解できると仮定して)。
チャット プログラムを機能させるにはほど遠い状態です。問題を完全には考えていません。
1) 独立して更新される 2 つのウィンドウが必要です。
Windows バッチは、複数のウィンドウをサポートしていません。ただし、ユーザーごとに 2 つのバッチ プロセスを実行することでエミュレートできます。1 つは入力用、もう 1 つはダイアログ出力用です。単一のバッチ スクリプトを両方のプロセスに使用できます。親スクリプトは、START コマンドを使用して複数のバッチ プロセスを起動できます。各バッチ プロセスには、独自のコンソール ウィンドウが表示されます。
2) 一度に 1 人 (プロセス) だけがテキスト ファイルに書き込むことができます。2 人が同時に書き込もうとするとどうなると思いますか? 一方は成功し、もう一方は失敗します。失敗を検出し、成功するまで自動的に再試行する方法が必要です。これを実現する簡単な方法については、「Windows でログ ファイルをどのように共有していますか?」で説明しています。.
<Enter>
3) 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) 1 人以上のユーザーをチャットに招待する方法。
7) 追加のコンソール ウィンドウを閉じるなど、プログラムを終了するクリーンな方法。これにはプロセス間通信が必要です。http://www.dostips.com/forum/viewtopic.php?t=4741の SNAKE.BAT ゲームでこれを示します。警告 - そのスクリプトには多くの高度な概念があるため、関連情報を抽出するのは難しいかもしれません ;-)
8) ダイアログ ウィンドウにスクロール可能な表示バッファがあると便利です。ユーザーはコンソールのプロパティを介してバッファのサイズを制御できますが、プログラムで制御すると便利です。ネイティブ バッチではこれを行うことはできませんが、CMD でハイブリッド PowerShell/バッチでこれを行う方法を示します。ウィンドウの高さとは無関係にバッファーの高さを設定します。