На боковой ноте msvcrt.kbhit () возвращает логическое значение, определяющее, нажата ли в данный момент клавиша на клавиатуре.
Итак, если вы делаете игру или что-то еще и хотите, чтобы нажатия клавиш делали что-то, но не останавливали игру целиком, вы можете использовать kbhit () внутри оператора if, чтобы убедиться, что ключ только извлекается, если пользователь действительно хочет что-то сделать.
Пример в Python 3:
# this would be in some kind of check_input function
if msvcrt.kbhit():
key = msvcrt.getch().decode("utf-8").lower() # getch() returns bytes data that we need to decode in order to read properly. i also forced lowercase which is optional but recommended
if key == "w": # here 'w' is used as an example
# do stuff
elif key == "a":
# do other stuff
elif key == "j":
# you get the point
В пакетных файлах, как и в стандартных программах на C, аргумент 0 содержит путь к исполняемому в данный момент сценарию. Вы можете использовать % ~ dp0
, чтобы получить только часть пути 0-го аргумента (который является текущим скриптом) - этот путь всегда является полностью определенным путем.
Вы также можете получить полностью определенный путь. вашего первого аргумента, используя % ~ f1
, но это дает путь в соответствии с текущим рабочим каталогом, что, очевидно, не то, что вам нужно.
Лично я часто использую идиому % ~ dp0% ~ 1
в моем пакетном файле, которая интерпретирует первый аргумент относительно пути исполняемого пакета. Однако у него есть недостаток: он терпит неудачу, если первый аргумент полностью определен.
Если вам необходимо поддерживать как относительные , так и абсолютные пути, вы можете использовать решение Фредерика Менеса : временно изменить текущий рабочий каталог.
Вот пример, демонстрирующий каждый из этих методов:
@echo off
echo %%~dp0 is "%~dp0"
echo %%0 is "%0"
echo %%~dpnx0 is "%~dpnx0"
echo %%~f1 is "%~f1"
echo %%~dp0%%~1 is "%~dp0%~1"
rem Temporarily change the current working directory, to retrieve a full path
rem to the first parameter
pushd .
cd %~dp0
echo batch-relative %%~f1 is "%~f1"
popd
Если вы сохраните его как c: \ temp \ example.bat и запустите его из c: \ Users \ Public как
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... вы увидите следующий результат:
%~dp0 is "C:\temp\"
%0 is "\temp\example.bat"
%~dpnx0 is "C:\temp\example.bat"
%~f1 is "C:\Users\windows"
%~dp0%~1 is "C:\temp\..\windows"
batch-relative %~f1 is "C:\Windows"
документацию по набору модификаторов, разрешенных для пакетного аргумента, можно найти здесь: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
В вашем примере из Bar \ test.bat, DIR / B / S .. \ somefile.txt вернет полный путь.
Это поможет заполнить пробелы в ответе Адриена Плиссона (за который следует проголосовать, как только он его отредактирует; -):
вы также можете получить полный путь вашего первого аргумента, используя% ~ f1 , но это дает путь в соответствии с текущим путем, что, очевидно, не то, что вам нужно.
к сожалению, я не знаю, как смешать 2 вместе ...
Можно обрабатывать % 0
и % 1
аналогичным образом:
% ~ dpnx0
для полного диска + путь + имя + расширение самого пакетного файла также достаточно % ~ f0
; % ~ dpnx1
для полного диска + путь + имя + расширение его первый аргумент [если это вообще имя файла], % ~ f1
также достаточно; % ~ f1
будет работать независимо от того, как вы указали свой первый аргумент: с относительными путями или с абсолютные пути (если вы не укажете расширение файла при присвоении имени % 1
, он не будет добавлен, даже если вы используете % ~ dpnx1
- однако.
Но как бы вы назвали файл на другом диске в любом случае, если бы вы изначально не указали полную информацию о пути в командной строке?
Однако, % ~ p0
, % ~ n0
, % ~ nx0
и % ~ x0
могут пригодиться, sh Вас интересует путь (без буквенного обозначения диска), имя файла (без расширения), полное имя файла с расширением или только расширение имени файла.Но обратите внимание, в то время как % ~ p1
и % ~ n1
будут работать, чтобы узнать путь или имя первого аргумента, % ~ nx1
и % ~ x1
не будет добавлять + показывать расширение, если вы уже не использовали его в командной строке.