Работа с %1
, shift или %*
может привести к сбою при перетаскивании, потому что проводник не очень умен, когда создает командную строку.
Файлы типа Cool&stuff.cue
не цитируются проводником, поэтому вы получаете команду типа
pcutmp3.bat Cool&stuff.cue
Таким образом, в %1
есть только Cool
, даже в %*
есть только Cool
, но после завершения pcutmp3.bat cmd.exe пытается выполнить stuff.cue
.
Чтобы справиться с этим, вы можете использовать это, он перехватывает все имена файлов с помощью переменной cmdcmdline
.
@echo off
setlocal ENABLEDELAYEDEXPANSION
rem *** Take the cmd-line, remove all until the first parameter
rem *** Copy cmdcmdline without any modifications, as cmdcmdline has some strange behaviour
set "params=!cmdcmdline!"
set "params=!params:~0,-1!"
set "params=!params:*" =!"
set count=0
rem Split the parameters on spaces but respect the quotes
for %%G IN (!params!) do (
set /a count+=1
set "item_!count!=%%~G"
rem echo !count! %%~G
)
rem list the parameters
for /L %%n in (1,1,!count!) DO (
echo %%n #!item_%%n!#
)
pause
REM ** The exit is important, so the cmd.exe doesn't try to execute commands after ampersands
exit
Btw. есть предел строки для операций перетаскивания ~ 2048 символов, несмотря на «стандартный» предел строки партии в 8191 символов.