这个问题是关于将文件名参数传递给批处理文件中的子例程的正确语法。我觉得这个问题应该被问过,但我似乎找不到正确的答案。假设在一个名为C:\Batch File Example
的文件夹中有三个文本文件。以下代码(部分借用自this answer)将输出文件名:
@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
但是,这也返回截断的结果,唯一的区别是只有一个迭代而不是三个迭代。
我尝试过使用enhanced variable substitionts,比如%~I
,而不是%%i
和%1
,但是我被困住了。那我错过了什么?
发布于 2018-11-19 07:54:04
参数由空格分隔-因此C:\Batch File Example\file.txt
是三个参数(更多,如果文件名也包含空格)。
要么使用%*
(“所有参数”)代替%1
,要么使用引号:... CALL :doecho "%%I"
,然后使用单个(引用)参数。如果您需要删除子例程中的引号,请使用%~1
https://stackoverflow.com/questions/53378230
复制