Модификаторы подстановки для для ссылок на переменные также позволяют использовать расширения ~.См. для ссылки на команду .
Используя "%%~x"
, вы должны получить правильно заключенный в кавычки параметр, аналогично тому, как bash обрабатывает "$@"
.
@echo off
setlocal enableextensions
for %%x in (%*) do (
echo "%%~x"
)
Символы, а также ;может использоваться для разделения параметров команды.См. Обзор командной оболочки .Таким образом, вы должны заключать в кавычки имена файлов, содержащие эти символы.
Если вы перетащите файл из Проводника на .bat, Проводник будет правильно заключать в кавычки файл, только если в его пути есть пробел.,Например, D:\a,b,c.exe
не будет заключен в кавычки Explorer и, следовательно, будет проанализирован как три отдельных аргумента cmd.exe.
Чтобы заставить скрипт работать с перетаскиванием из Проводника для этих странных случаев, вы можетеиспользуйте следующий (уродливый) обходной путь:
@echo off
setlocal enableextensions enabledelayedexpansion
set "args=%*"
set "args=%args:,=:comma:%"
set "args=%args:;=:semicolon:%"
for %%x in (%args%) do (
set "filepath=%%~x"
set "filepath=!filepath::comma:=,!"
set "filepath=!filepath::semicolon:=;!"
echo "!filepath!"
)
Сценарий вводит вспомогательную переменную args
, где каждое вхождение проблемного символа заменяется заполнителем (обратите внимание, что сам символ двоеточия не может бытьиспользуется в имени файла в Windows).
В теле цикла for используется другая вспомогательная переменная filepath
, которая отменяет преобразование для получения исходного пути.