Бродил по интернету, увидел статью на хабре. Забавно. Писать на BAT не очень то сложно, а людям нравится. Решил тоже замутить что-нибудь эдакое. Припомнил недавно написанные долгосрочки по ОСям: чаты на сокетах(версия на Qt) и майлслотах(версии на Qt и С#). Попробовать? Хм… А почему бы и нет?
Скрипт следует выложить в какую-нибудь расшаренную папку и запустить с нескольких компьютеров. У вас должны быть права записи в этой папке! После запуска вам предложат ввести имя чата и свой ник. Количество участников не ограничено.
Исходный код скрипта:
При написании скрипта столкнулся со следующими проблемами:
1) Команда start не хотела принимать параметры к запускаемому процессу в кавычках.
2) Команда cd не умеет работать с путями UNC.(например: "\\ACER\Шара")
1) Посмотрим параметры запуска команды start:
Проверим команды:
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» — ошибка:
Далее как не юлим(/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\Шара":
Команда cd не поддерживает пути UNC, а вот команда pushd очень даже их поддерживает. Проблема решается вызовом из скрипта следующей команды: pushd "%~d0%~p0".
При написании скрипта очень помогли следующие ссылки:
1. Справочник по параметрам командной строки
2. Синтаксис BAT-файлов и командная строка в MS-DOS
_________
Текст подготовлен в ХабраРедакторе
Скрипт следует выложить в какую-нибудь расшаренную папку и запустить с нескольких компьютеров. У вас должны быть права записи в этой папке! После запуска вам предложат ввести имя чата и свой ник. Количество участников не ограничено.
Исходный код скрипта:
@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
_________
Текст подготовлен в ХабраРедакторе