Как через командную строку нажать любую клавишу
Сообщения: 65
Благодарности: 7
Как известно, при обработке команды «Pause» командный процессор выводит сообщение: «Для продолжения нажмите любую клавишу . . .» Но, если при наличии в коде нескольких последовательных команд «Pause» напр.:
Echo 1 Pause Echo 2 Pause Echo 3 Rem и т.д.
нажать одну из клавиш навигации(стрелку) произойдёт обработка сразу двух команд «Pause» , равносильно двойному нажатию клавиши «Enter».
Подскажите, каким образом можно обойти этот баг, т.е. как сделать, чтобы нажатие клавиш навигации обрабатывало одну «Pause»? Может существуют альтернативные решения для реализации паузы в bat-скриптах?
Console. Read Key Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает следующий нажатый пользователем символ или функциональную клавишу.
Перегрузки
Получает следующий нажатый пользователем символ или функциональную клавишу. Нажатая клавиша отображается в окне консоли.
Получает следующий нажатый пользователем символ или функциональную клавишу. Нажатая клавиша может быть отображена в окне консоли.
ReadKey()
Получает следующий нажатый пользователем символ или функциональную клавишу. Нажатая клавиша отображается в окне консоли.
public: static ConsoleKeyInfo ReadKey();
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")] public static ConsoleKeyInfo ReadKey ();
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")] [System.Runtime.Versioning.UnsupportedOSPlatform("android")] [System.Runtime.Versioning.UnsupportedOSPlatform("ios")] [System.Runtime.Versioning.UnsupportedOSPlatform("tvos")] public static ConsoleKeyInfo ReadKey ();
public static ConsoleKeyInfo ReadKey ();
[] static member ReadKey : unit -> ConsoleKeyInfo
[] [] [] [] static member ReadKey : unit -> ConsoleKeyInfo
static member ReadKey : unit -> ConsoleKeyInfo
Public Shared Function ReadKey () As ConsoleKeyInfo
Возвращаемое значение
Объект, описывающий константу ConsoleKey и символ Юникода (при наличии), соответствующий нажатой клавише консоли. Этот объект ConsoleKeyInfo также описывает в битовой комбинации значений ConsoleModifiers, нажимались ли клавиши-модификаторы (одна или несколько) Shift, Alt или Ctrl одновременно с клавишей консоли.
Исключения
Свойство In перенаправлено из потока, отличного от консоли.
Примеры
Одним из наиболее распространенных способов ReadKey() использования метода является остановка выполнения программы до тех пор, пока пользователь не нажмет клавишу и приложение не завершит работу или не отобразит дополнительное окно с информацией. В следующем примере метод используется ReadKey() для ожидания нажатия пользователем клавиши ВВОД перед завершением приложения.
using System; public class Example < public static void Main() < DateTime dat = DateTime.Now; Console.WriteLine("The time: at ", dat); TimeZoneInfo tz = TimeZoneInfo.Local; Console.WriteLine("The time zone: \n", tz.IsDaylightSavingTime(dat) ? tz.DaylightName : tz.StandardName); Console.Write("Press to exit. "); while (Console.ReadKey().Key != ConsoleKey.Enter) <> > > // The example displays output like the following: // The time: 11/11/2015 at 4:02 PM: // The time zone: Pacific Standard Time
open System let dat = DateTime.Now printfn $"The time: at " let tz = TimeZoneInfo.Local printfn $"The time zone: \n" printf"Press to exit. " while Console.ReadKey().Key <> ConsoleKey.Enter do () // The example displays output like the following: // The time: 12/28/2021 at 8:35 PM // The time zone: Pacific Standard Time
Module Example Public Sub Main() Dim dat As Date = Date.Now Console.WriteLine("The time: at ", dat) Dim tz As TimeZoneInfo = TimeZoneInfo.Local Console.WriteLine("The time zone: ", If(tz.IsDaylightSavingTime(dat), tz.DaylightName, tz.StandardName)) Console.WriteLine() Console.Write("Press to exit. ") Do While Console.ReadKey().Key <> ConsoleKey.Enter Loop End Sub End Module ' The example displays the following output: ' The time: 11/11/2015 at 4:02 PM ' The time zone: Pacific Standard Time
Обратите внимание, что эта перегрузка ReadKey метода по умолчанию повторяет все отображаемые клавиши, нажимаемые пользователем в консоли. Чтобы подавить их, вызовите ReadKey метод с аргументом true intercept .
В следующем примере метод используется для ReadKey() отображения сведений о нажатой пользователем клавише.
using namespace System; void main() < ConsoleKeyInfo cki; // Prevent example from ending if CTL+C is pressed. Console::TreatControlCAsInput = true; Console::WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key."); Console::WriteLine("Press the Escape (Esc) key to quit: \n"); do < cki = Console::ReadKey(); Console::Write(" --- You pressed "); if((cki.Modifiers & ConsoleModifiers::Alt) != ConsoleModifiers()) Console::Write("ALT+"); if((cki.Modifiers & ConsoleModifiers::Shift) != ConsoleModifiers()) Console::Write("SHIFT+"); if((cki.Modifiers & ConsoleModifiers::Control) != ConsoleModifiers()) Console::Write("CTL+"); Console::WriteLine(cki.Key.ToString()); >while (cki.Key != ConsoleKey::Escape); > // This example displays output similar to the following: // Press any combination of CTL, ALT, and SHIFT, and a console key. // Press the Escape (Esc) key to quit: // // a --- You pressed A // k --- You pressed ALT+K // ► --- You pressed CTL+P // --- You pressed RightArrow // R --- You pressed SHIFT+R // --- You pressed CTL+I // j --- You pressed ALT+J // O --- You pressed SHIFT+O // § --- You pressed CTL+U >
using System; class Example < public static void Main() < ConsoleKeyInfo cki; // Prevent example from ending if CTL+C is pressed. Console.TreatControlCAsInput = true; Console.WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key."); Console.WriteLine("Press the Escape (Esc) key to quit: \n"); do < cki = Console.ReadKey(); Console.Write(" --- You pressed "); if((cki.Modifiers & ConsoleModifiers.Alt) != 0) Console.Write("ALT+"); if((cki.Modifiers & ConsoleModifiers.Shift) != 0) Console.Write("SHIFT+"); if((cki.Modifiers & ConsoleModifiers.Control) != 0) Console.Write("CTL+"); Console.WriteLine(cki.Key.ToString()); >while (cki.Key != ConsoleKey.Escape); > > // This example displays output similar to the following: // Press any combination of CTL, ALT, and SHIFT, and a console key. // Press the Escape (Esc) key to quit: // // a --- You pressed A // k --- You pressed ALT+K // ► --- You pressed CTL+P // --- You pressed RightArrow // R --- You pressed SHIFT+R // --- You pressed CTL+I // j --- You pressed ALT+J // O --- You pressed SHIFT+O // § --- You pressed CTL+U
open System // Prevent example from ending if CTL+C is pressed. Console.TreatControlCAsInput while cki.Key <> ConsoleKey.Escape do cki 0 then printf "ALT+" if int (cki.Modifiers &&& ConsoleModifiers.Shift) <> 0 then printf "SHIFT+" if int (cki.Modifiers &&& ConsoleModifiers.Control) <> 0 then printf "CTL+" printfn $"" // This example displays output similar to the following: // Press any combination of CTL, ALT, and SHIFT, and a console key. // Press the Escape (Esc) key to quit: // // a --- You pressed A // k --- You pressed ALT+K // ► --- You pressed CTL+P // --- You pressed RightArrow // R --- You pressed SHIFT+R // --- You pressed CTL+I // j --- You pressed ALT+J // O --- You pressed SHIFT+O // § --- You pressed CTL+U
Class Example Public Shared Sub Main() Dim cki As ConsoleKeyInfo ' Prevent example from ending if CTL+C is pressed. Console.TreatControlCAsInput = True Console.WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key.") Console.WriteLine("Press the Escape (Esc) key to quit: " + vbCrLf) Do cki = Console.ReadKey() Console.Write(" --- You pressed ") If (cki.Modifiers And ConsoleModifiers.Alt) <> 0 Then Console.Write("ALT+") If (cki.Modifiers And ConsoleModifiers.Shift) <> 0 Then Console.Write("SHIFT+") If (cki.Modifiers And ConsoleModifiers.Control) <> 0 Then Console.Write("CTL+") Console.WriteLine(cki.Key.ToString) Loop While cki.Key <> ConsoleKey.Escape End Sub End Class ' This example displays output similar to the following: ' Press any combination of CTL, ALT, and SHIFT, and a console key. ' Press the Escape (Esc) key to quit: ' ' a --- You pressed A ' k --- You pressed ALT+K ' ► --- You pressed CTL+P ' --- You pressed RightArrow ' R --- You pressed SHIFT+R ' --- You pressed CTL+I ' j --- You pressed ALT+J ' O --- You pressed SHIFT+O ' § --- You pressed CTL+U
Комментарии
Метод ReadKey ожидает, то есть блокирует поток, выдающий ReadKey метод, пока не будет нажат символьная или функциональная клавиша. Символьная или функциональная клавиша может быть нажата в сочетании с одной или несколькими клавишами-модификаторами ALT, CTRL или SHIFT. Однако нажатие клавиши-модификатора само по себе не приведет к возврату ReadKey метода.
В зависимости от приложения может потребоваться использовать метод в сочетании ReadKey со свойством KeyAvailable .
Метод ReadKey считывает с клавиатуры, даже если стандартные входные данные перенаправляются в файл с SetIn помощью метода .
См. также раздел
- ConsoleKey
- KeyAvailable
- TreatControlCAsInput
- CancelKeyPress
Применяется к
ReadKey(Boolean)
Получает следующий нажатый пользователем символ или функциональную клавишу. Нажатая клавиша может быть отображена в окне консоли.
public: static ConsoleKeyInfo ReadKey(bool intercept);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")] public static ConsoleKeyInfo ReadKey (bool intercept);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")] [System.Runtime.Versioning.UnsupportedOSPlatform("android")] [System.Runtime.Versioning.UnsupportedOSPlatform("ios")] [System.Runtime.Versioning.UnsupportedOSPlatform("tvos")] public static ConsoleKeyInfo ReadKey (bool intercept);
public static ConsoleKeyInfo ReadKey (bool intercept);
[] static member ReadKey : bool -> ConsoleKeyInfo
[] [] [] [] static member ReadKey : bool -> ConsoleKeyInfo
static member ReadKey : bool -> ConsoleKeyInfo
Public Shared Function ReadKey (intercept As Boolean) As ConsoleKeyInfo
Параметры
Определяет, следует ли отображать нажатую клавишу в окне консоли. Значение true , чтобы не отображать нажатую клавишу; в противном случае — значение false .
Возвращаемое значение
Объект, описывающий константу ConsoleKey и символ Юникода (при наличии), соответствующий нажатой клавише консоли. Этот объект ConsoleKeyInfo также описывает в битовой комбинации значений ConsoleModifiers, нажимались ли клавиши-модификаторы (одна или несколько) Shift, Alt или Ctrl одновременно с клавишей консоли.
Исключения
Свойство In перенаправлено из потока, отличного от консоли.
Примеры
Одним из наиболее распространенных способов ReadKey использования метода является остановка выполнения программы до тех пор, пока пользователь не нажмет клавишу и приложение не завершит работу или не отобразит дополнительное окно с информацией. В следующем примере метод используется ReadKey(Boolean) для ожидания нажатия пользователем клавиши ВВОД перед завершением приложения. Обратите внимание, что если пользователь нажимает любую другую клавишу, она не передается в консоль.
using System; public class Example < public static void Main() < DateTime dat = DateTime.Now; Console.WriteLine("The time: at ", dat); TimeZoneInfo tz = TimeZoneInfo.Local; Console.WriteLine("The time zone: \n", tz.IsDaylightSavingTime(dat) ? tz.DaylightName : tz.StandardName); Console.Write("Press to exit. "); while (Console.ReadKey(true).Key != ConsoleKey.Enter) <> > > // The example displays output like the following: // The time: 11/11/2015 at 4:02 PM: // The time zone: Pacific Standard Time
open System let dat = DateTime.Now printfn $"The time: at " let tz = TimeZoneInfo.Local printfn $"The time zone: \n" printf"Press to exit. " while Console.ReadKey(true).Key <> ConsoleKey.Enter do () // The example displays output like the following: // The time: 12/28/2021 at 8:37 PM // The time zone: Pacific Standard Time
Module Example Public Sub Main() Dim dat As Date = Date.Now Console.WriteLine("The time: at ", dat) Dim tz As TimeZoneInfo = TimeZoneInfo.Local Console.WriteLine("The time zone: ", If(tz.IsDaylightSavingTime(dat), tz.DaylightName, tz.StandardName)) Console.WriteLine() Console.Write("Press to exit. ") Do While Console.ReadKey(True).Key <> ConsoleKey.Enter Loop End Sub End Module ' The example displays the following output: ' The time: 11/11/2015 at 4:02 PM ' The time zone: Pacific Standard Time
В следующем примере метод используется ReadKey(Boolean) для отображения сведений о клавише, нажатой пользователем, без повторения этой клавиши в консоли.
using namespace System; void main() < ConsoleKeyInfo cki; // Prevent example from ending if CTL+C is pressed. Console::TreatControlCAsInput = true; Console::WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key."); Console::WriteLine("Press the Escape (Esc) key to quit: \n"); do < cki = Console::ReadKey(true); Console::Write("You pressed "); if ((cki.Modifiers & ConsoleModifiers::Alt) != ConsoleModifiers()) Console::Write("ALT+"); if ((cki.Modifiers & ConsoleModifiers::Shift) != ConsoleModifiers()) Console::Write("SHIFT+"); if ((cki.Modifiers & ConsoleModifiers::Control) != ConsoleModifiers()) Console::Write("CTL+"); Console::WriteLine("(character '')", cki.Key, cki.KeyChar); > while (cki.Key != ConsoleKey::Escape); > // This example displays output similar to the following: // Press any combination of CTL, ALT, and SHIFT, and a console key. // Press the Escape (Esc) key to quit: // // You pressed CTL+A (character '☺') // You pressed C (character 'c') // You pressed CTL+C (character '♥') // You pressed K (character 'k') // You pressed ALT+I (character 'i') // You pressed ALT+U (character 'u') // You pressed ALT+SHIFT+H (character 'H') // You pressed Escape (character '←')
using System; class Example < public static void Main() < ConsoleKeyInfo cki; // Prevent example from ending if CTL+C is pressed. Console.TreatControlCAsInput = true; Console.WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key."); Console.WriteLine("Press the Escape (Esc) key to quit: \n"); do < cki = Console.ReadKey(true); Console.Write("You pressed "); if ((cki.Modifiers & ConsoleModifiers.Alt) != 0) Console.Write("ALT+"); if ((cki.Modifiers & ConsoleModifiers.Shift) != 0) Console.Write("SHIFT+"); if ((cki.Modifiers & ConsoleModifiers.Control) != 0) Console.Write("CTL+"); Console.WriteLine("(character '')", cki.Key, cki.KeyChar); > while (cki.Key != ConsoleKey.Escape); > > // This example displays output similar to the following: // Press any combination of CTL, ALT, and SHIFT, and a console key. // Press the Escape (Esc) key to quit: // // You pressed CTL+A (character '☺') // You pressed C (character 'c') // You pressed CTL+C (character '♥') // You pressed K (character 'k') // You pressed ALT+I (character 'i') // You pressed ALT+U (character 'u') // You pressed ALT+SHIFT+H (character 'H') // You pressed Escape (character '←')
open System // Prevent example from ending if CTL+C is pressed. Console.TreatControlCAsInput while cki.Key <> ConsoleKey.Escape do cki 0 then printf "ALT+" if int (cki.Modifiers &&& ConsoleModifiers.Shift) <> 0 then printf "SHIFT+" if int (cki.Modifiers &&& ConsoleModifiers.Control) <> 0 then printf "CTL+" printfn $" (character '')" // This example displays output similar to the following: // Press any combination of CTL, ALT, and SHIFT, and a console key. // Press the Escape (Esc) key to quit: // // You pressed CTL+A (character '☺') // You pressed C (character 'c') // You pressed CTL+C (character '♥') // You pressed K (character 'k') // You pressed ALT+I (character 'i') // You pressed ALT+U (character 'u') // You pressed ALT+SHIFT+H (character 'H') // You pressed Escape (character '←')
Class Example Public Shared Sub Main() Dim cki As ConsoleKeyInfo ' Prevent example from ending if CTL+C is pressed. Console.TreatControlCAsInput = True Console.WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key.") Console.WriteLine("Press the Escape (Esc) key to quit: " + vbCrLf) Do cki = Console.ReadKey(True) Console.Write("You pressed ") If (cki.Modifiers And ConsoleModifiers.Alt) <> 0 Then Console.Write("ALT+") If (cki.Modifiers And ConsoleModifiers.Shift) <> 0 Then Console.Write("SHIFT+") If (cki.Modifiers And ConsoleModifiers.Control) <> 0 Then Console.Write("CTL+") Console.WriteLine(" (character '')", cki.Key, cki.KeyChar) Loop While cki.Key <> ConsoleKey.Escape End Sub End Class ' This example displays output similar to the following: ' Press any combination of CTL, ALT, and SHIFT, and a console key. ' Press the Escape (Esc) key to quit: ' ' You pressed CTL+A (character '☺') ' You pressed C (character 'c') ' You pressed CTL+C (character '♥') ' You pressed K (character 'k') ' You pressed ALT+I (character 'i') ' You pressed ALT+U (character 'u') ' You pressed ALT+SHIFT+H (character 'H') ' You pressed Escape (character '←')
Комментарии
Метод ReadKey ожидает, то есть блокирует поток, выдающий ReadKey метод, пока не будет нажат символьная или функциональная клавиша. Символьная или функциональная клавиша может быть нажата в сочетании с одной или несколькими клавишами-модификаторами ALT, CTRL или SHIFT. Однако нажатие клавиши-модификатора само по себе не приведет к возврату ReadKey метода.
intercept Если параметр имеет значение true , нажатая клавиша перехватывается и не отображается в окне консоли; в противном случае отображается нажатая клавиша.
В зависимости от приложения может потребоваться использовать метод в сочетании ReadKey со свойством KeyAvailable .
Метод ReadKey считывает с клавиатуры, даже если стандартные входные данные перенаправляются в файл с SetIn помощью метода .
См. также раздел
- ConsoleKey
- KeyAvailable
- TreatControlCAsInput
- CancelKeyPress
CMD/BAT: Как-то можно поменять «Нажмите любую клавишу для . «?
Как-то можно поменять стандартную надпись «Нажмите любую клавишу для продолжения . » от команды pause?
Полагаю, она забита в ехе-шник cmd.exe?
2 Ответ от wisgest 2019-10-27 17:55:23
- wisgest
- Разработчик
- Неактивен










Re: CMD/BAT: Как-то можно поменять «Нажмите любую клавишу для . «?
Для подавления стандартного сообщения перенаправить вывод PAUSE в NUL;
для добавления своего сообшения см. CMD/BAT: вывод текста без переноса на новую строку.
Также такая возможность есть в Take Command Console (последний бесплатный выпуск — 14.0).
Команда Timeout — задать период ожидания.
Команда Timeout используется в командных файлах для организации режима ожидания фиксированного интервала времени в секундах, либо интервала до нажатия клавиши на клавиатуре.
Формат командной строки:
TIMEOUT [/T] таймаут [/NOBREAK]
Параметры командной строки:
/T таймаут — Время ожидания в секундах. Допустимый интервал: от -1 до 99999 секунд.
/NOBREAK — Игнорировать нажатия клавиш, ждать указанное время.
/? — Вывод справки по использованию.
Примечание: значение таймаута, равное -1 задает неограниченное время ожидания до нажатия клавиши.
TIMEOUT /? — отобразить краткую справку по использованию команды
TIMEOUT /T 10 установить режим ожидания 10 секунд. На экран выдается информационное сообщение с отсчетом оставшегося до завершения интервала времени ( 10, 9, 8 секунд . . . ):
Время ожидания 10 сек., нажмите любую клавишу для продолжения
Нажатие любой клавиши приведет к прерыванию таймаута и переходу к выполнению следующей команды.
TIMEOUT /T 300 /NOBREAK — установить интервал ожидания 300 секунд. Нажатие любых клавиш на клавиатуре игнорируется. Нажатие комбинации CTRL+C приведет к выдаче запроса:
Завершить выполнение пакетного файла [Y(да)/N(нет)]?
При ответе N(нет) выполняется завершение таймаута и переход к выполнению следующей команды командного файла. При ответе Y(да)/ — выполняется завершение командного файла. Вместо комбинации CTRL+C можно использовать CTRL+Break.
TIMEOUT /T -1 — ожидание нажатия любой клавиши. На экран выдается сообщение:
Нажмите любую клавишу для продолжения.
Если в данной команде использовать параметр /NOBREAK , то возможен ввод только комбинации CTRL+C