Открыть окно командной строки и запустите там cmd /?
. Эта команда выводит справку для командного процессора Windows. На последней странице справки в последнем абзаце написано, какие символы в каталоге или имени файла или аргументы исполняемых файлов и скриптов требуют использования двойных кавычек: пробел и &()[]{}^=;!'+,`~
Тогда символ %
имеет специальное значение в командном файле, так как он отмечает начало и конец переменной среды. Чтобы указать %
как буквенный символ, он должен быть экранирован еще одним %
.
В окне командной строки запустите set
и вы увидите стандартные переменные среды для вашей учетной записи пользователя на вашем компьютере. Одна из этих стандартных переменных окружения - USERPROFILE, которая содержит путь к папке профиля текущего пользователя, содержащую, например, подпапку Desktop
.
Теперь давайте посмотрим на следующую строку из вашего пакетного файла:
youtube-dl.exe --extract-audio --audio-format mp3 --output C:\Users\*******\Desktop\(ext)s.%(ext)s %audio%
Было бы хорошо, чтобы использовать здесь ссылку на переменные окружения USERPROFILE для каталога Desktop
. Имя учетной записи пользователя может содержать пробельный символ, поэтому рекомендуется заключить путь в двойные кавычки. Далее заключены круглые скобки и один знак процента, который определенно требует двойных кавычек и избегает знака процента.
URL-адрес, хранящийся в переменной окружения audio
, не может содержать пробел, как в URL-адресах, пробельный символ должен быть закодирован с помощью% 20. Но этот знак одного процента снова вызывает проблемы при интерпретации строки командным процессором Windows. Решение использует задержанное расширение.
Давайте посмотрим на этот код партии:
@echo off
setlocal EnableDelayedExpansion
set "ToolPath=%~dp0"
cd /D "%USERPROFILE%\Desktop"
:audio
cls
echo.
echo.
echo Your audio will be downloaded and saved as a .mp3 format
echo.
echo.
set /P "audio=Enter audio URL here: "
cls
"%ToolPath%youtube-dl.exe" --extract-audio --audio-format mp3 --output "%USERPROFILE%\Desktop\(ext)s.%%(ext)s" "!audio!"
pause
cls
echo.
echo.
echo.
echo.
echo Your audio has now been downloaded.
%SystemRoot%\System32\ping.exe 127.0.0.1 -n 4 >nul
endlocal
exit /B
Пакетный файл сначала создает локальную копию всех переменных окружения, позволяет с задержкой расширения переменных и также помнить текущий рабочий каталог.
Далее путь к каталогу, содержащему командный файл и другие исполняемые файлы, используемые этим командным файлом, присваивается переменной ToolPath
. Запустите в окне командной строки call /?
для получения дополнительной информации о %~dp0
(диск и путь аргумента 0 - командный файл - всегда заканчивается обратным слэшем).
Затем текущий каталог изменяется на каталог Desktop
используемой учетной записи пользователя, независимо от которой был запущен командный файл. Запустите в командной строке окно cd /?
для получения дополнительной информации об этой команде и ее параметрах.
Линия с youtube-dl.exe
изменилась, поскольку в настоящее время исполняемый файл вызывается с полным путем (в качестве текущего рабочего каталога теперь находится каталог пользователя Desktop
). Кроме того, выходной каталог заключен в двойные кавычки, использует также переменную окружения USERPROFILE, имеет знак единого процента, сбегающий с еще одним %
, и URL-адрес теперь упоминается в двойных кавычках с использованием замедленного расширения (восклицательные знаки вместо знаков процента). Запустите в окне командной строки set /?
для получения справки и информации о задержанном расширении.
Для таймаута в течение 3 секунд значение, используемое для команды PING должно быть 4, так как первый пинг всегда сразу же удался.
Команда Endlocal приводит отбрасывая локальную копию таблицы с переменным окружением (ToolPath
не определен больше после этой строки и все изменения на других переменных теряются), восстанавливает предыдущие значения замедленного расширения (скорее всего токарные он отключен по умолчанию) и расширения команд (скорее всего, по-прежнему включены по умолчанию), а также восстановление предыдущего рабочего каталога (скорее всего, путь к пакетному файлу, если он начинается с двойного щелчка).
Примечание: Я не тестировал предоставленный пакетный файл, поскольку у меня нет youtube-dl.exe
.
Я не предполагаю, что у вас есть пробелы в имени пользователя? – SomethingDark
Было бы лучше сделать сохранение для пути к var и позволить пользователю вводить его в пакет – Jonas