本帖最后由 老刘1号 于 2023-9-16 12:00 编辑
就是靠waitfor来传递
发送.bat | @echo off | | for /f %%a in ('echo prompt $H^|cmd') do set "bs=%%a" | | title 发送 | | :1 | | set "key=" | | for /f "delims=" %%a in ('xcopy /w . 2^>nul') do if not defined key set "key=%%a" | | set key=%key:~-1% | | if "%key%" == "" ( | | echo= | | set key=enter | | ) else if "%key%" == "%bs%" ( | | <nul set/p=%bs% %bs% | | set key=backspace | | ) else if "%key%" == " " ( | | <nul set/p=_%bs% | | set key=space | | ) else <nul set/p=%key% | | >nul waitfor /si %key% | | goto 1COPY |
接收.bat | @echo off | | for /f %%a in ('echo prompt $H^|cmd') do set "bs=%%a" | | title 接收 | | if not "%1" == "" goto a | | for %%a in (0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z enter backspace space) do start /b "" "%~f0" %%a | | pause>nul | | exit | | | | :a | | >nul waitfor %1 | | if "%1" == "enter" ( | | echo= | | ) else if "%1" == "backspace" ( | | <nul set/p=%bs% %bs% | | ) else if "%1" == "space" ( | | <nul set/p=_%bs% | | ) else <nul set/p=%1 | | goto aCOPY |
不过只支持英文、退格、空格、回车,上面的代码还没写标点符号,可以自己加
写到一个窗口里,用了终端控制符,临时赶出来的,比较潦草杂乱: | @echo off | | title demo | | mode 60,40 | | | | set r_h=3 | | set r_l=15 | | | | set response_w=22;15 | | | | for /f %%a in ('echo prompt $H^|cmd') do set "bs=%%a" | | for /f %%a in ('echo=prompt $E^|cmd') do set "esc=%%a" | | | | | | if not "%1" == "" goto a | | echo=加载中.... | | for %%a in (0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z enter backspace space) do start /b "" "%~f0" %%a&&ping 127.1 /n 1 >nul | | cls | | ping 127.1 /n 2 >nul | | set/pa=%esc%[20;1H<nul | | echo============================================================= | | set/pa=%esc%[%r_h%;%r_l%H<nul | | :1 | | set "key=" | | for /f "delims=" %%a in ('xcopy /w . 2^>nul') do if not defined key set "key=%%a" | | set key=%key:~-1% | | if "%key%" == "" set key=enter | | if "%key%" == "%bs%" set key=backspace | | if "%key%" == " " set key=space | | call :draw %key% | | >nul waitfor /si %key% /s 192.168.1.7 | | goto 1 | | | | | | | | :a | | >nul waitfor %1 | | if "%1" == "enter" ( | | echo= | | <nul set/p=_%bs% | | ) else if "%1" == "backspace" ( | | <nul set/p=%bs% %bs% | | ) else if "%1" == "space" ( | | <nul set/p=_%bs% | | ) else ( | | <nul set/p=%1 | | ) | | goto a | | | | | | :draw | | if "%1" == "enter" ( | | set/pa=%esc%[%response_w%H<nul | | echo= | | <nul set/p=_%bs% | | call :get_cursor_pos pos response_w | | set/ar_h+=1 | | set r_l=15 | | set/pa=%esc%[%r_h%;%r_l%H<nul | | ) else if "%1" == "backspace" ( | | set/pa=%esc%[%response_w%H<nul | | <nul set/p=%bs% %bs% | | call :get_cursor_pos pos response_w | | set/ar_l-=1 | | set/pa=%esc%[%r_h%;%r_l%H<nul | | ) else if "%1" == "space" ( | | set/pa=%esc%[%response_w%H<nul | | <nul set/p=_%bs% | | call :get_cursor_pos pos response_w | | set/ar_l+=1 | | set/pa=%esc%[%r_h%;%r_l%H<nul | | ) else ( | | set/pa=%esc%[%response_w%H<nul | | <nul set/p=%1 | | call :get_cursor_pos pos response_w | | set/ar_l+=1 | | set/pa=%esc%[%r_h%;%r_l%H<nul | | ) | | exit /b | | | | | | :get_cursor_pos | | set "response=" | | set pos=2 | | :_get_loop | | <nul set /p "=%esc%[6n" | | for /l %%# in (1 1 %pos%) do pause<con>nul | | set "char=;" | | for /f "tokens=1 skip=1 delims=*" %%c in ('"replace /w ? . < con"') do set "char=%%c" | | set "response=%response%%char%" | | set /a pos+=1 | | if "%char%" neq "R" goto :_get_loop | | set %2=%response:~0,-1% | | exit /bCOPY |
缺点就是双方同时发送内容的话会有bug,还有写的时候是在一台电脑写的,所以两台电脑的读部分也会随着写部分位移
删不到上一行、大小写没做处理 |