林製作.BAT遊戲計時器,目前在命令把代碼時是蝙蝠遊戲。添加具有集/ P
set /p command=
我想知道的是,如果你能以某種方式對輸入的時間限制命令。例如,如果你打了一個警衛,並且你還沒有發出5秒的命令,守衛就會發起攻擊。
這不是迫切需要的東西,我只是想知道更多關於即時通訊綁定的限制,我想我知道了anawer反正(答案是,你不能)
感謝
林製作.BAT遊戲計時器,目前在命令把代碼時是蝙蝠遊戲。添加具有集/ P
set /p command=
我想知道的是,如果你能以某種方式對輸入的時間限制命令。例如,如果你打了一個警衛,並且你還沒有發出5秒的命令,守衛就會發起攻擊。
這不是迫切需要的東西,我只是想知道更多關於即時通訊綁定的限制,我想我知道了anawer反正(答案是,你不能)
感謝
它也只批進行。
您可以使用start /b
創建第二個線程(在同一個窗口中)。
如果此線程等待set /p
用於用戶輸入,則主線程不受影響。
如果用戶輸入的文本將被移入文件,則此示例將等待5秒鐘,以便第一個線程可以訪問它。
@echo off
setlocal EnableDelayedExpansion
if "%1" NEQ "" goto %1
del enter.tmp 2>nul >nul
start /b cmd /c %0 :secondThread
:FirstThread
set n=0
echo Enter Text (5 seconds timeout):
:loop
set /a n+=1
ping -n 2 localhost > nul
if !n! LSS 5 (
if not exist entER.tmp goto :loop
< Enter.tmp (
set /p input=
)
echo !input!
) ELSE (
echo Timeout for input
)
exit /b
:secondThread
set /p var=
> enter.tmp echo !var!
exit /b
此方法的問題在於第二個線程接收輸入焦點,因此要結束它必須讀取輸入。如果第一個線程在5秒後繼續並執行另一個START/B,則會創建第三個線程,該線程將接收輸入焦點(無法終止第二個線程),依此類推。 – Aacini
它可以將批處理文件與其他內容混合使用,例如c#。由於.NET現在幾乎安裝在所有的Windows PC上,這應該不是什麼大問題。
在下面的例子中,有3秒的延遲,用戶可以輸入一些輸入。如果沒有輸入,程序繼續,但%result%
將爲空。
/* 2>NUL
@echo off
REM cls
set WinDirNet=%WinDir%\Microsoft.NET\Framework
IF EXIST "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"
IF EXIST "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"
IF EXIST "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe"
%csc% /nologo /out:"%~0.exe" %0
echo enter some text:
set result=
for /F "tokens=*" %%a in ('"%~0.exe"') do set result=%%a
echo you have entered:%result%
del "%~0.exe"
goto :eof
*/
using System;
using System.Text;
using System.IO;
using System.Threading;
class Program
{
static void Main (string[] args)
{
byte[] buffer=new byte[80];
using (Stream s = Console.OpenStandardInput()) {
ManualResetEvent e=new ManualResetEvent(false);
s.BeginRead (buffer, 0, buffer.Length, x => e.Set(), null);
e.WaitOne (3000);
}
Console.WriteLine (Encoding.UTF8.GetString (buffer));
}
}
這樣你可以計劃你的批處理文件,並使用C#的一切東西在批處理文件是不可能的。請注意,此代碼可能有幾項改進。
請參閱How to add a Timeout to Console.ReadLine()?以改進c#代碼。
批處理文件功能可以與輔助程序的幫助增加,如果他們用匯編語言編寫的一些至極的可能很簡單:
@ECHO OFF
(
ECHO A100
ECHO MOV AH,B
ECHO INT 21
ECHO MOV AH,4C
ECHO INT 21
ECHO/
ECHO RCX
ECHO 8
ECHO W
ECHO Q
) | DEBUG CHKKEY.COM
上一頁批處理文件創建的8個字節長的CHKKEY.COM輔助程序,檢查是否按下了一個鍵,如果是的話返回ERRORLEVEL爲255,否則返回零。例如:
:waitforkey
echo Waiting for a key to be pressed...
chkkey
if not errorlevel 1 goto waitforkey
echo A key was pressed!
如果你還沒有DEBUG.COM程序,你可以在網上找到它。這樣一來,等待鍵5秒:
for /F "tokens=3 delims=:." %%a in ("%time%") do set /A second=%%c+5
if %second% geq 60 set /A second-=60
:waitforkey
for /F "tokens=3 delims=:." %%a in ("%time%") do if %%c == %second% goto timeexceeded
chkkey
if not errorlevel 1 goto waitforkey
set /P command=
如果通過1 MOV AH,B指令改變B值,關鍵是看其ASCII碼是ERRORLEVEL返回;此功能允許讀取單個按鍵並立即處理它。如果值爲8,則讀取的鍵不會顯示在屏幕上;這允許處理鍵盤偶數函數的任何鍵和返回兩個值的特殊鍵:第一個鍵爲零(標識特殊鍵),第二個鍵標識按下的鍵。例如,F1鍵返回0和59。
如果命令有一個唯一的起始字母,也許你可以考慮使用CHOICE命令? (可在Windows 7中重新使用)
如果只使用批處理腳本,則不適用。解決此問題的方法是讓批處理腳本調用不是用MS批處理腳本編寫的定時器程序。 – Mikhail
查看http://stackoverflow.com/questions/299392/how-do-i-create-a-batch-file-timer-to-execute-call-another-batch-throughout-the – Mikhail
認真? 2011年,你正在製作批處理文件遊戲? –