Как стать автором
Обновить

Чат на Bat

Бродил по интернету, увидел статью на хабре. Забавно. Писать на BAT не очень то сложно, а людям нравится. Решил тоже замутить что-нибудь эдакое. Припомнил недавно написанные долгосрочки по ОСям: чаты на сокетах(версия на Qt) и майлслотах(версии на Qt и С#). Попробовать? Хм… А почему бы и нет?

Скриншот процесса общения в чате (32Кб)




Скрипт следует выложить в какую-нибудь расшаренную папку и запустить с нескольких компьютеров. У вас должны быть права записи в этой папке! После запуска вам предложат ввести имя чата и свой ник. Количество участников не ограничено.

Исходный код скрипта:
@echo off
cls
pushd "%~d0%~p0"
echo Current DIR: "%CD%"
if "%~1" == "talk_widget" goto talker

rem ////////////////////
:auth
echo Enter chat filename to connect ("abc" for example):
set /p chat=^>
if not exist "%chat%" echo.>"%chat%"
echo Enter your nick:
set /p nick=^>
start call %0 talk_widget %chat% %nick%

rem ////////////////////
:listener
cls
call title "| Chat: %chat% | User: %nick% |"
if exist "%chat%_history" type "%chat%_history"

:list_go
ping 127.0.0.1 -n 1 -w 20 > nul
set oldtext=%text%
set /p text=<"%chat%"
if not "%text%" == "%oldtext%" echo %text%
goto list_go
rem ////////////////////

rem ////////////////////
rem // %2 - chat name //
rem // %3 - user nick //
rem ////////////////////
:talker
set chat=%~2
set nick=%~3
cls
call title "| Chat: %chat% | User: %nick% |"
echo (%TIME% %nick% connected)>>"%chat%_history"
call ::cs_in
echo (%TIME% %nick% connected)>"%chat%"
call ::cs_out

:talkloop
cls
echo Dear %nick%, type message to send:
set /p msg=^>
rem call ::cs_in
echo [%TIME% %nick%]: %msg%>"%chat%"
rem call ::cs_out
echo [%TIME% %nick%]: %msg%>>"%chat%_history"
goto talkloop
rem ////////////////////

rem ////////////////////
:cs_in
if exist "%chat%_cs" ping 127.0.0.1 -n 1 -w 50 > nul
set cs_value=%RANDOM%

:cs_in_loop
echo %cs_value%>"%chat%_cs"
set /p ret=<"%chat%_cs"
if "%ret%" == "%cs_value%" exit /b
echo "%ret%" != "%cs_value%"
ping 127.0.0.1 -n 1 -w 50 > nul
goto :cs_in_loop
rem ////////////////////

rem ////////////////////
:cs_out
del "%chat%_cs"
exit /b
rem ////////////////////

rem =========================================================

* Подсветка синтаксиса не выполнена.


При написании скрипта столкнулся со следующими проблемами:
1) Команда start не хотела принимать параметры к запускаемому процессу в кавычках.
2) Команда cd не умеет работать с путями UNC.(например: "\\ACER\Шара")

1) Посмотрим параметры запуска команды start:
START ["заголовок"] [/Dпуть] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME| /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B]
      [команда/программа] [параметры]

Проверим команды:
start 1.bat — запускает новый процесс 1.bat
start 1.bat p1 p2 — запускает новый процесс 1.bat с двумя параметрами
start 1.bat «p1» «p2» — запускает новый процесс 1.bat с двумя параметрами
start «1.bat» — запускает новый процесс cmd.exe с заголовком окна «1.bat»
start «title1» «1.bat» — запускает новый процесс 1.bat с заголовком окна «title1»
start «title1» «1.bat» «p1» «p2» — ошибка:
«1.bat» «1» «2» не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Далее как не юлим(/D вообще не помог), не получается запустить процесс в имени и в параметрах которого есть пробелы, например, «C:\Documents and Settings\k06a\Рабочий стол\1.bat» и параметры «a b c» и «new param».

Выход из ситуации нашел следующий:
start call «C:\Documents and Settings\k06a\Рабочий стол\1.bat» «a b c» «new param»

2) Запустим наш BAT из папки "\\ACER\Шара":
"\\ACER\Шара"
Указанный путь был использован при запуске CMD.EXE в качестве текущей папки.
CMD.EXE не поддерживает пути UNC. По умолчанию выбрана системная папка Windows.

Команда cd не поддерживает пути UNC, а вот команда pushd очень даже их поддерживает. Проблема решается вызовом из скрипта следующей команды: pushd "%~d0%~p0".


При написании скрипта очень помогли следующие ссылки:
1. Справочник по параметрам командной строки
2. Синтаксис BAT-файлов и командная строка в MS-DOS

_________
Текст подготовлен в ХабраРедакторе
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.