Разрешить абсолютный путь из относительного пути и / или имени файла

На боковой ноте 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
144
задан Peter Mortensen 22 November 2014 в 07:50
поделиться

3 ответа

В пакетных файлах, как и в стандартных программах на 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

154
ответ дан 23 November 2019 в 22:32
поделиться

В вашем примере из Bar \ test.bat, DIR / B / S .. \ somefile.txt вернет полный путь.

1
ответ дан 23 November 2019 в 22:32
поделиться

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

вы также можете получить полный путь вашего первого аргумента, используя% ~ f1 , но это дает путь в соответствии с текущим путем, что, очевидно, не то, что вам нужно.

к сожалению, я не знаю, как смешать 2 вместе ...

Можно обрабатывать % 0 и % 1 аналогичным образом:

  • % ~ dpnx0 для полного диска + путь + имя + расширение самого пакетного файла также достаточно
    % ~ f0 ;
  • % ~ dpnx1 для полного диска + путь + имя + расширение его первый аргумент [если это вообще имя файла],
    % ~ f1 также достаточно;

% ~ f1 будет работать независимо от того, как вы указали свой первый аргумент: с относительными путями или с абсолютные пути (если вы не укажете расширение файла при присвоении имени % 1 , он не будет добавлен, даже если вы используете % ~ dpnx1 - однако.

Но как бы вы назвали файл на другом диске в любом случае, если бы вы изначально не указали полную информацию о пути в командной строке?

Однако, % ~ p0 , % ~ n0 , % ~ nx0 и % ~ x0 могут пригодиться, sh Вас интересует путь (без буквенного обозначения диска), имя файла (без расширения), полное имя файла с расширением или только расширение имени файла.Но обратите внимание, в то время как % ~ p1 и % ~ n1 будут работать, чтобы узнать путь или имя первого аргумента, % ~ nx1 и % ~ x1 не будет добавлять + показывать расширение, если вы уже не использовали его в командной строке.

15
ответ дан 23 November 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: