Альтернативным синтаксическим анализатором, который очень похож на синтаксический анализатор CALL, является простой FOR.Есть два усложняющих фактора:
1 - FOR нельзя расширять, если включено отложенное расширение, если оно содержит !
.Это легко обрабатывается.
2- Содержимое не должно содержать подстановочных знаков *
или ?
.?
можно временно заменить, а затем вернуть.Но не существует простого способа поиска и замены *
.
Поскольку эта проблема пытается разобрать путь, а пути не могут содержать подстановочные знаки, эту проблему легко решить без использования CALL.Я добавил !
в контрольный пример для полноты.
@echo off
setlocal disableDelayedExpansion
set input="c:\path with spaces, ampersand &, carets ^ and (parentheses)! and %% signs\python.exe" "%%1" %%*
set input
set "output="
setlocal enableDelayedExpansion
for %%A in (!input!) do if not defined output endlocal & set output=%%A
set output
Если мы можем полагаться на тот факт, что первый токен всегда будет заключен в кавычки, то решение будет еще проще.Мы можем использовать FOR / F с EOL и DELIMS, установленными на "
.
@echo off
setlocal disableDelayedExpansion
set input="c:\path with spaces, ampersand &, carets ^ and (parentheses)! and %% signs\python.exe" "%%1" %%*
set input
set "output="
setlocal enableDelayedExpansion
for /f eol^=^"^ delims^=^" %%A in ("!input!") do endlocal & set output="%%A"
set output
Однако я просто посмотрел на вывод FTYPE и обнаружил, что некоторые записи не были заключены в кавычки, даже если они содержат пробелы впуть!Я не думаю, что какой-либо из ответов на этой странице справится с этим.На самом деле вся идея вопроса может быть ошибочной.