Search
Write a publication
Pull to refresh

Чат на 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

_________
Текст подготовлен в ХабраРедакторе
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.