Войти

Показать полную графическую версию : [решено] Разбор параметров командной строки, содержащих символ *


tech-gs
26-03-2016, 12:33
Добрый день.
Задача состоит в следующем. Необходимо сформировать массив ARG##, состоящий из принятых скриптом параметров командной строки, а так же сформировать переменную CMDARG, состоящую из всех принятых параметров. Особенность принимаемых параметров в том, что они могут содержать символы '*', '#' и '.'.
Задачу удалось решить двумя вариантами, но в обоих присутствуют свои "грабли".

В закомментированном цикле for обрабатывается столько параметров, сколько принято, но видимо из-за (%*) теряются параметры, содержащие символ *.
Во втором цикле for параметры с символом * обрабатываются нормально, но получается использовать только 9 параметров, т.к. 10-ый параметр передается в :PARAMSET как 1-ый & 0, 11-ый - как 2-ой & 0 и т.д.

Помогите собрать воедино оба кода, чтобы обрабатывались все принятые параметры, в т.ч. содержащие *.
Для удобства прикрепляю готовые к тестированию файлы (см. cmd.zip).


set ARG01=-
set CMDARG=-
set /a c=1

::for %%i in (%*) do (
:: call :PARAMSET %%i
::)

for /l %%i in (1,1,11) do (
call :PARAMSET %%%%i
)

exit /b

:PARAMSET
echo par%c%='%1'
if not '%1'=='' (
if '!CMDARG!'=='-' set CMDARG=
if %c% LSS 10 (set num=0%c%) else (set num=%c%)
set ARG!num!=%1
set CMDARG=!CMDARG! %1
set /a c=c+1
)
goto :EOF

Iska
26-03-2016, 13:27
Необходимо сформировать массив ARG##, состоящий из принятых скриптом параметров командной строки, »
В чём проблема-то?
@echo off

set /a iNum = 0

:Repeat
set sVar=%~1
set /a iNum += 1
set sNum=0%iNum%

if defined sVar (
set ARG%sNum:~-2%=%sVar%
shift
goto :Repeat
)

set ARG

exit /b 0

C:\Мои проекты\0003>0001.cmd Мама мыла раму 1*2 3#4 567 Седьмой Восьмой Девятый Десятый Одиннадцатый
ARG01=Мама
ARG02=мыла
ARG03=раму
ARG04=1*2
ARG05=3#4
ARG06=567
ARG07=Седьмой
ARG08=Восьмой
ARG09=Девятый
ARG10=Десятый
ARG11=Одиннадцатый

а так же сформировать переменную CMDARG, состоящую из всех принятых параметров. »
set CMDARG=%*

Georgio
26-03-2016, 13:41
В закомментированном цикле for обрабатывается столько параметров, сколько принято, но видимо из-за (%*) теряются параметры »



Нет, не из-за этого. Символ "*" в "%*" не влияет на потерю параметров, содержащих символ "*". На потерю параметров влияет именно особенность разбора командой "FOR" элементов с символами "*", а также и с символами "?".

Дело в том, что использование команды "FOR" без ключей изначально рассчитано на обработку файлов в качестве элементов набора, а символы "*" и "?" в этом случае являются подстановачными символами.

Команда "FOR" без ключей, обрабатывая элемент набора, содержащий символы "*" и "?", ищет файлы, подпадающие под этот шаблон, и не найдя таковых, выдаёт пустой результат.

Интересно, что если файлы, подпадающие под такой шаблон, будут обнаружены, то обрабатываться будет именно список этих файлов, что может привести к большим неожиданностям в результатах выполнения пакетного файла...:):):)

tech-gs
26-03-2016, 13:45
В чём проблема-то? »
Действительно, проблемы нет.
Подозревал, что найдется совершенно иной подход. Все работает, спасибо!




© OSzone.net 2001-2012