在批处理脚本中转义*

时间:2019-04-28 10:40:48

标签: batch-file count arguments

我正在尝试获取批处理脚本中传递的参数的数量。我找到了适当的答案here。直到我通过一个带有星号(*)的参数,它才能完美地工作。

argcount.bat

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
)

echo Number of processed arguments: %argCount%

for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"

用法:

argcount abc def ghi

这给了我3个参数:abc, def, ghi

argcount abc def *ghi jkl

这也给了我3 args:abc, def, jkl

我应该在哪里获得4参数:abc def *ghi jkl

问题

如何获得实际的参数计数以及加星号的参数?

1 个答案:

答案 0 :(得分:4)

for旨在循环文件,因此in子句中的字符串应该是文件名或文件掩码。
如果没有这样的文件名,则将字符串作为字符串处理,但是一旦涉及通配符(*?),该字符串就会发生变化:列表将扩展为所有匹配的文件名(您没有与*ghi匹配的文件,因此列表仍然为空-请尝试使用*.bat ...)。
因此(尽管很优雅),for循环并不是您所需要的。而是循环循环遍历您的参数:

@echo off
setlocal enabledelayedexpansion
set argCount=0
:loop
   if "%~1" == "" goto :done
   set /A argCount+=1
   set "argVec[!argCount!]=%~1"
   shift
goto :loop
:done
echo Number of processed arguments: %argCount%

for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"