Есть ли способ создать команду CMD с аргументами? - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь создать команду в командной строке, но использую аргументы, как вы можете сделать с функцией на другом языке.

Например, вы можете создать пакетный файл в C : \ Windows \ System32 и запустите ее в командной строке, введя ее имя, создав «команду». Это очень просто, и просто запускает все, что содержит пакетный файл.

Моя команда называется toolbx, в которой есть различные полезные ярлыки в командной строке. Но я хочу запустить разные инструменты, набрав что-то вроде toolbx 1. Вот как это может выглядеть поэтому другой пример в Python может быть:

def functionWithArgs (tool)

Выполняется как:

functionWithArgs(1)

В качестве другого резюме:

Я пытаюсь создать команду, используемую в командной строке, с командным файлом

Я хочу, чтобы командный файл имел аргументы, определенные при запуске команды (как пример python), который может использоваться в качестве переменных в командном файле.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Если вы говорите, что хотите использовать аргументы при запуске команды, а не командный файл, у вас есть опции, отличные от простого использования параметров (% 1 и далее)

Опции включают функции в качестве подпрограмм, использующих Call команда, или, в виде макроса. Кроме того, вы можете создать al oop для получения ввода, используя Set /P, и прервать l oop после подтверждения ввода.

В зависимости от ваших потребностей, вы также можете создать подпрограмму, которая проверяет for / принимает входные данные из другого файла.

Взгляните здесь на пример программы, которая использует подпрограммы для некоторых идей.

Пример макроса формы аргументов Command , модифицированный, чтобы принимать входные данные в форме списков для присвоения массиву (хотя другие действия в списке также возможны).

@Echo off 

    Setlocal DisableDelayedExpansion

    (Set LF=^


    %= NewLine =%)

    Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
::: \

::: / Macro for recieving exceptionally large arguments
Set "Inc.Class=Set /A %%G+=1"
Set "Inc.Index=Set /A %%H+=1"

Endlocal & Set Define.Array=^&for /L %%n in (1 1 2) do if %%n==2 (%\n%
        For /F "tokens=1,2 delims=, " %%G in ("!argv!") do (%\n%
            %Inc.Class% %\n%
%= iterate over the tempVar for each argument to be processed =%
            For %%A in (!Args-In!) do (%\n%
%= Increment the count for the current array name =%
                %Inc.Index% %\n%
%= Assign the current arg to the current Array Index =%
                Set "%%G[!%%G!][!%%H!]=%%~A" %\n%
            ) %\n%
%= Store the Arg-In to reference list of all args for future reuse =%
            Set Ref_%%G[!%%G!]=!Args-In! %\n%
        ) %\n%
    ) ELSE set argv=, 
::: \

::: / Mini-Macro used in conjunction with Define.Array to Pseudo pipe complex strings into the Macro.
    Set "Params|=Set Args-In="
::: \

:main
::: / 'Switch on' Define.Array Macro in advance. This is in order to resolve the Setlocal recursion breach that occurs if Expansion is enabled within the macro.
    Setlocal enableDelayedExpansion
::: \

::: / Example usage of paired macro's
::: - Demonstrate definition fo linked element names to matrices
%Params|% "Object_A" "Object_B" "Object_C" "Object_D" %Define.Array% Class I1 
%Params|% "Object_E" "Object_F" "Object_G" "Object_H" %Define.Array% Element I2
%Params|% "Object_I" "Object_J" "Object_K" "Object_L" %Define.Array% Array I3
%Params|% "Object_M" "Object_N" "Object_O" "Object_P" %Define.Array% Variable I4
%Params|% "Object_Q" "Object_R" "Object_S" "Object_T" %Define.Array% Element I5
%Params|% "Object_U" "Object_V" "Object_W" "Object_X" %Define.Array% Array I6
%Params|% "Object_Y" "Object_Z" "Object_0" "Object_1" %Define.Array% Variable I7
%Params|% "Object_2" "Object_3" "Object_4" "Object_5" %Define.Array% Class I8
%Params|% "Object_6" "Object_7" "Object_8" "Object_9" %Define.Array% Element I9
::: - Demonstrate building values obtained during a for loop into a string to be fed into Define.Array
%Params|% & (For %%A in ("example of" "string building" "Using a For Loop" "^(If defined, the Reset of the Args-In Variable is required^)") do (%Params|%!Args-In! "%%~A")) %Define.Array% BuildString I10


::: Example of ways to Iterate over the Array values.
For %%A in (Class Element Array Variable BuildString) do (
    For /L %%C in (1,1,!%%A!) do (
%= subroutine builds a string containing all index values for later reuse by referring to the element and index names =%
        Set Ref_%%A[%%C]
%= I# allows a unique reference number for each array to iterate over that array with =%
        For /L %%I in (1,1,!I%%C!) do (
            If not "!%%A[%%C][%%I]!"=="" Set %%A[%%C][%%I]
        )
    Echo.
    )
    Echo.
)

For %%C in (Class Element Array Variable BuildString) do For /L %%E in (1,1,!%%C!) do For %%I in (!Ref_%%C[%%E]!) Do Echo %%~I

Pause >nul
Exit /B
::: \

Этот подход к предоставлению ввода в макрос Обходит ограничения токена структуры аргумента For / F l oop. Он не оставляет структуру полностью, так как он полезен для предоставления возвращаемых переменных для вывода макроса. Чтобы избежать нарушения уровня рекурсии, расширение Delayed включается до раскрытия макроса, а параметр Switch для включения расширения Delayed удаляется из определения макроса.

1 голос
/ 22 марта 2020

Вы можете использовать макро стиль , изобретенный @ jeb , @ dbenham и пользователем DosTips @ Ed Dyreen :

Определения:

@echo off
SETLOCAL DISABLEDELAYEDEXPANSION

::Definitions
( set LF=^
%= EMPTY =%
)
set ^"NL=^^^%LF%%LF%^%LF%%LF%^^"

Целью является создание переменной multiline . См. пакетную переменную новой строки hack

Основной макрос:

::Macro
ENDLOCAL &^
set $MACRO.Toolbx=FOR %%a in (args main) do if "%%a" == "main" (%NL%
    for %%A in (%payload%) do (%NL%
        %= MAIN MACRO HERE, END LINES WITH NL =%%NL%
    )%NL%
) ELSE SETLOCAL ENABLEDELAYEDEXPANSION ^& set args=,

exit /b

Сохраните это как MACRO.Toolbx.bat. Чтобы использовать макрос внутри вашего пакетного файла:

call MACRO.Toolbx.bat
%$MACRO.Toolbx% COMMAND_LINE_ARGS

Макрос использует умный FOR l oop, чтобы «перехватить» аргументы. Кроме того, для отлова аргументов необходимо DISABLEDELAYEDEXPANSION, что неотделимо от SETLOCAL. Однако ENDLOCAL уничтожит все пользовательские переменные в этом диапазоне, но нам нужны определения новой строки. Следовательно, ENDLOCAL и определение макроса должны быть в той же строке . Эта техника называется ENDLOCAL туннелирование .

1 голос
/ 21 марта 2020

Сегодня ваш счастливый день, windows пакетные файлы действительно поддерживают функцию, называемую параметры командной строки . Вот что вам нужно сделать:

set inputRecieved=%1
if "%inputRecieved%"=="1" goto label1
goto :eof

:label1
   blabla...

Удачного кодирования!

PS

Обратите внимание, что правильное написание слова "принято", а не " получил».

...