Этот вопрос касается правильного синтаксиса для передачи аргументов имени файла подпрограмме в пакетном файле. Похоже, этот вопрос нужно было задавать раньше, но я не могу найти правильный ответ. Предположим, в папке есть три текстовых файла с именем C:\Batch File Example
. Следующий код (частично заимствованный из этого ответа ) выведет имена файлов:
@echo off
SETLOCAL Enableextensions
ECHO Line before FOR
FOR /R "C:\Batch File Example\" %%i in (*.txt) DO ECHO %%i
ECHO Line after FOR & PAUSE>NUL
Выход:
Line before FOR
C:\Batch File Example\File1.txt
C:\Batch File Example\FIle2.txt
C:\Batch File Example\File3.txt
Line after FOR
Теперь я хочу получить тот же вывод, используя вместо этого подпрограмму, например:
@echo off
SETLOCAL Enableextensions
ECHO Line before FOR
FOR /R "C:\Batch File Example\" %%i in (*.txt) DO CALL :doecho %%i
ECHO Line after FOR & PAUSE>NUL
GOTO :EOF
:doecho
SET VAR=%1
ECHO VAR is %VAR%
EXIT /b
Но это дает следующий вывод, где результат усекается:
Line before FOR
VAR is C:\Batch
VAR is C:\Batch
VAR is C:\Batch
Line after FOR
Приведенный выше результат свидетельствует о том, что пробел рассматривается как разделитель и что %1
содержит только C:\Batch
, поэтому вместо этого я попытался использовать следующий цикл for с флагом /F
и разделителем запятых для подавления пробела:
FOR /F "delims=," %%i IN ("C:\Batch File Example\*.txt") DO CALL :doecho %%i
Однако это также возвращает усеченный результат, с той лишь разницей, что вместо трех существует только одна итерация.
Я пытался использовать расширенные переменные подстановки , например %~I
вместо %%i
и %1
, но я застрял. Так чего мне не хватает?