игра с битой Добавление таймера с set / p - PullRequest
5 голосов
/ 09 октября 2011

Я играю в .bat, и в настоящее время при вводе команды код

set /p command=

Что я хочу знать, так это то, можете ли вы как-то ограничить время ввода команд. Например, если вы сражаетесь с охранником, и вы не вводите команду, скажем, в течение 5 секунд, охранник атакует.

Это не является чем-то крайне необходимым, мне просто интересно узнать об ограничениях, с которыми я связан, и я думаю, что я все равно знаю анавер (ответ таков: вы не можете)

Спасибо

Ответы [ 4 ]

3 голосов
/ 09 октября 2011

Это также может быть сделано только с партией.

Вы можете создать второй поток (в том же окне) с помощью 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
3 голосов
/ 09 октября 2011

Возможно смешать командный файл с чем-то другим, например c #. Поскольку в настоящее время .net установлен практически на всех компьютерах с Windows, это не должно быть большой проблемой.

В приведенном ниже примере есть 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 # для всего, что невозможно в пакетных файлах. Обратите внимание, что возможны некоторые улучшения этого кода.

См. Как добавить Timeout в Console.ReadLine ()? для улучшения кода c #.

(Источник встроенного кода C #)

1 голос
/ 18 октября 2011

Если команды имеют уникальную начальную букву, может быть, вы можете использовать команду CHOICE ? (Снова доступно в Windows 7)

1 голос
/ 16 октября 2011

Возможности пакетного файла могут быть расширены с помощью вспомогательных программ, некоторые из которых могут быть очень простыми, если они написаны на языке ассемблера:

@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

Предыдущий пакетный файл создает CHKKEY длиной 8 байтов.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=

Если вы измените значение B на 1 в инструкции MOV AH, B, ключ будет считан, и его код ASCII будет возвращен в ERRORLEVEL;эта функция позволяет прочитать одно нажатие клавиши и обработать его немедленно.Если значение равно 8, прочитанная клавиша не отображается на экране;это позволяет обрабатывать любую клавишу клавиатуры, даже функциональные и специальные клавиши, которые возвращают два значения: первое - ноль (обозначающее специальную клавишу), а второе - нажатую клавишу.Например, клавиша F1 возвращает 0 и 59.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...