Предотвратить интерпретатор команд 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!
Другие вопросы по тегам