Escape * в пакетном скрипте - PullRequest
       15

Escape * в пакетном скрипте

1 голос
/ 28 апреля 2019

Я пытаюсь получить количество переданных аргументов в моем пакетном скрипте.Я нашел соответствующий ответ здесь .Он работал безупречно, пока я не передал аргумент со звездой (*).

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 аргументов: abc, def, jkl

Где я должен получить 4 args: abc def *ghi jkl

Вопрос

Как я могу получить фактическое количество аргументов вместе сзвездный аргумент?

1 Ответ

4 голосов
/ 28 апреля 2019

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]!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...