Пакетный файл: передать имя файла в подпрограмму из цикла FOR - PullRequest
0 голосов
/ 19 ноября 2018

Этот вопрос касается правильного синтаксиса для передачи аргументов имени файла подпрограмме в пакетном файле. Похоже, этот вопрос нужно было задавать раньше, но я не могу найти правильный ответ. Предположим, в папке есть три текстовых файла с именем 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, но я застрял. Так чего мне не хватает?

1 Ответ

0 голосов
/ 19 ноября 2018

параметры разделены пробелами - поэтому C:\Batch File Example\file.txt являются тремя параметрами (больше, если имя файла также содержит пробелы).

Либо используйте %* ("все параметры") вместо %1, либо используйте кавычки: ... CALL :doecho "%%I", тогда это один (цитируемый) параметр. Если вам нужно удалить кавычки в вашей подпрограмме, используйте %~1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...