Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Разбор параметров командной строки, содержащих символ * (http://forum.oszone.net/showthread.php?t=313143)

tech-gs 26-03-2016 12:33 2619933

Разбор параметров командной строки, содержащих символ *
 
Вложений: 1
Добрый день.
Задача состоит в следующем. Необходимо сформировать массив 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 2619951

Цитата:

Цитата tech-gs
Необходимо сформировать массив 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=Одиннадцатый

Цитата:

Цитата tech-gs
а так же сформировать переменную CMDARG, состоящую из всех принятых параметров. »

Код:

set CMDARG=%*

Georgio 26-03-2016 13:41 2619963

Цитата:

Цитата tech-gs
В закомментированном цикле for обрабатывается столько параметров, сколько принято, но видимо из-за (%*) теряются параметры »



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

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

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

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

tech-gs 26-03-2016 13:45 2619966

Цитата:

Цитата Iska
В чём проблема-то? »

Действительно, проблемы нет.
Подозревал, что найдется совершенно иной подход. Все работает, спасибо!


Время: 09:28.

Время: 09:28.
© OSzone.net 2001-