Предотвратить интерпретатор команд Windows (FOR) рассматривать список как символы подстановки?
Я пытаюсь написать командный файл, который принимает пару аргументов, за которыми следует одно или несколько необязательных имен файлов (которые могут включать в себя подстановочные знаки) и в какой-то момент обрабатывает каждое из необязательных имен файлов, но for
Команда пытается их расширить, поэтому даже печать их не будет работать.
Я проверил помощь (for /?
), но, кажется, нет никаких переключателей, чтобы предотвратить это. Я пытался использовать одинарные, двойные и обратные кавычки, а также /f
, но ничего не работает.
Следующая команда работает так, как и следовало ожидать:
> for %i in (foo bar baz) do @echo %i
foo
bar
baz
Следующая команда не делает:
> for %i in (foo bar baz really?) do @echo %i
foo
bar
baz
Следующее, даже в меньшей степени:
> ren > reallyz
The syntax of the command is incorrect.
> dir /b really*
reallyz
> for %i in (foo bar baz really?) do @echo %i
foo
bar
baz
reallyz
Есть ли способ заставить интерпретатор команд Windows обрабатывать переданный список как строки и не пытаться интерпретировать его как подстановочные знаки имени файла?
1 ответ
Нет - простая команда FOR всегда расширяет *
а также ?
подстановочные знаки
Вам нужно использовать цикл GOTO, чтобы делать то, что вы хотите. Команда SHIFT разрешает доступ ко всем параметрам.
@echo off
:argLoop
if "%~1" neq "" (
echo %1
shift /1
goto :argLoop
)
Скорее всего, вы хотите сделать больше с аргументами, а затем просто распечатать их. Обычно вы сохраняете их в "массиве" переменных для последующего использования.
@echo off
setlocal
set argCnt=1
:argLoop
if "%~1" neq "" (
set "arg.%argCnt%=%~1"
set /a argCnt+=1
shift /1
goto :argLoop
)
set /a argCnt-=1
:: Show Args
setlocal enableDelayedExpansion
for /l %%N in (1 1 %argCnt%) do echo arg.%%N = !arg.%%N!