Phân tích cú pháp đối số tùy chọn tệp Windows Bat


84

Tôi cần tệp bat của mình để chấp nhận nhiều đối số có tên tùy chọn.

mycmd.bat man1 man2 -username alice -otheroption

Ví dụ: lệnh của tôi có 2 tham số bắt buộc và hai tham số tùy chọn (-username) có giá trị đối số là alice và -otheroption:

Tôi muốn có thể đưa các giá trị này vào các biến.

Chỉ cần gọi cho bất kỳ ai là đã giải quyết được vấn đề này. Người đàn ông những tập tin dơi này là một nỗi đau.


12
Bất kỳ lý do gì bạn phải làm điều này trong một tệp BAT và không nói trong VBScript? Có thể có một cách để thực hiện điều này trong tệp BAT, nhưng cứ bám vào cách tiếp cận tệp BAT, bạn "đang bước vào một thế giới đau đớn, con trai". :-)
Alek Davis

Tốt hơn nữa là sử dụng PowerShell. Nó có quản lý tham số rất tiên tiến và được tích hợp sẵn.
Bill_Stewart

1
@AlekDavis, bạn có thể đúng, nhưng tôi rất thích VBScript. Nếu tôi từng thấy mình phải sử dụng VBScript, tôi nghĩ rằng tôi đã ở trong một thế giới đau đớn. Tôi sẽ rất vui khi viết cho mình một tệp batch để tự động hóa một cái gì đó, sau đó có lẽ nếu tôi muốn làm cho nó hữu ích hơn cho mọi người thì tôi sẽ thêm một số đối số. Thường thì một số trong số này là tùy chọn. Từ lúc rời bỏ thế giới ngân hàng, tôi chưa từng nghĩ hay có ai đó gợi ý rằng "bạn sẽ muốn một số VBScript cho việc đó".
icc97 29/12/16

@chickeninabiscuit: Liên kết không còn hoạt động. Phiên bản máy Wayback không. Tôi không biết nếu tôi chỉnh sửa bình luận của bạn nếu Nó sẽ thay đổi nó để trông giống như tôi đã làm công việc hay không tôi chỉ cần đi để dán nó ở đây thay vì: http://web.archive.org/web/20090403050231/http://www.pcguide.com/vb/showthread.php?t=52323.
Brent Rittenhouse

Câu trả lời:


112

Mặc dù tôi có xu hướng đồng ý với nhận xét của @AlekDavis , nhưng vẫn có một số cách để thực hiện điều này trong NT shell.

Cách tiếp cận tôi sẽ tận dụng lệnh SHIFT và phân nhánh có điều kiện IF , giống như thế này ...

@ECHO OFF

SET man1=%1
SET man2=%2
SHIFT & SHIFT

:loop
IF NOT "%1"=="" (
    IF "%1"=="-username" (
        SET user=%2
        SHIFT
    )
    IF "%1"=="-otheroption" (
        SET other=%2
        SHIFT
    )
    SHIFT
    GOTO :loop
)

ECHO Man1 = %man1%
ECHO Man2 = %man2%
ECHO Username = %user%
ECHO Other option = %other%

REM ...do stuff here...

:theend

1
SHIFT /2thay đổi bắt đầu từ đối số 2. Nó không thay đổi hai lần. Không nên thay thế nó bằng SHIFT & SHIFT?
dbenham,

2
OK - Tôi hiểu tại sao mã thường hoạt động - SHIFT trong vòng lặp cuối cùng chuyển các tùy chọn sang đối số 1 và không có tác hại nào được thực hiện (thường là). Nhưng SHIFT / 2 ban đầu chắc chắn là một lỗi sẽ làm hỏng kết quả nếu giá trị đối số 1 khớp với một trong các tên tùy chọn. Hãy thử chạy mycmd.bat -username anyvalue -username myName -otheroption othervalue. Kết quả phải là user = myName, other = othervalue; nhưng mã cho người dùng = -tên người dùng, khác = giá trị khác. Lỗi được sửa bằng cách thay thế SHIFT /2bằng SHIFT & SHIFT.
dbenham

2
@Christian - ewall không chính xác về ;- nó không thể được sử dụng thay cho &.
dbenham

1
Đây là một khởi đầu tuyệt vời, nhưng tôi thấy có 3 vấn đề. Đầu tiên: a) Sau dòng 10, %1%2đã được "Sử dụng". b) Đơn vị SHIFTtrong dòng 11 di chuyển giá trị %2xuống 1 vị trí và sau đó có sẵn (một lần nữa) dưới dạng %1, và giá trị "Không sử dụng" của %3có sẵn dưới dạng %2. c) IFDòng 13 nhìn thấy giá trị "Đã sử dụng" này hiện đã có từ %2đó %1. d) Nếu "tên người dùng" từ dòng 10 trông giống như vậy "-otheroption", nó sẽ được sử dụng lại và othersẽ được đặt thành giá trị mới %2, có thể là tên của tùy chọn tiếp theo. --->
Kevin Fegan

2
Vấn đề thứ 2: Trong Câu hỏi OP, -otheroptiongiá trị không được theo sau bởi một giá trị, vì vậy nó có thể được hiểu là một -Flagtùy chọn kiểu và không nên sử dụng đối số thứ hai. Thứ 3: Nếu đối số %1không được xử lý bởi các IFcâu lệnh bên trong , nó sẽ bị bỏ qua một cách im lặng. Mã có thể sẽ hiển thị một thông báo cho biết đây không phải là một tùy chọn hợp lệ. Điều này có thể được thực hiện bằng cách thêm các câu lệnh SHIFTGOTO :loopcâu lệnh bắt buộc vào các IFcâu lệnh nội bộ hoặc bằng cách thêm một ELSEcâu lệnh.
Kevin Fegan

74

Câu trả lời đã chọn hoạt động, nhưng nó có thể sử dụng một số cải tiến.

  • Các tùy chọn có thể nên được khởi tạo thành các giá trị mặc định.
  • Sẽ rất tốt nếu giữ nguyên% 0 cũng như các args yêu cầu% 1 và% 2.
  • Việc có một khối IF cho mọi tùy chọn trở nên khó khăn, đặc biệt là khi số lượng tùy chọn ngày càng tăng.
  • Sẽ thật tuyệt nếu có một cách đơn giản và ngắn gọn để nhanh chóng xác định tất cả các tùy chọn và mặc định ở một nơi.
  • Sẽ rất tốt nếu hỗ trợ các tùy chọn độc lập đóng vai trò là cờ (không có giá trị nào theo sau tùy chọn).
  • Chúng tôi không biết liệu một đối số có được đặt trong dấu ngoặc kép hay không. Chúng tôi cũng không biết liệu một giá trị đối số có được chuyển bằng cách sử dụng các ký tự thoát hay không. Tốt hơn nên truy cập vào một đối số bằng cách sử dụng% ~ 1 và đặt phần gán trong dấu ngoặc kép. Sau đó, lô có thể dựa vào việc không có dấu ngoặc kép đi kèm, nhưng các ký tự đặc biệt nói chung vẫn an toàn mà không bị thoát. (Đây không phải là chống đạn, nhưng nó xử lý hầu hết các tình huống)

Giải pháp của tôi dựa vào việc tạo một biến OPTIONS xác định tất cả các tùy chọn và giá trị mặc định của chúng. OPTIONS cũng được sử dụng để kiểm tra xem một tùy chọn được cung cấp có hợp lệ hay không. Một lượng lớn mã được lưu bằng cách lưu trữ các giá trị tùy chọn trong các biến có tên giống như tùy chọn. Số lượng mã là không đổi bất kể có bao nhiêu tùy chọn được xác định; chỉ có định nghĩa OPTIONS phải thay đổi.

CHỈNH SỬA - Ngoài ra, mã vòng lặp: phải thay đổi nếu số lượng các đối số vị trí bắt buộc thay đổi. Ví dụ: thường thì tất cả các đối số đều được đặt tên, trong trường hợp đó bạn muốn phân tích cú pháp các đối số bắt đầu từ vị trí 1 thay vì 3. Vì vậy, trong vòng lặp:, cả 3 trở thành 1 và 4 trở thành 2.

@echo off
setlocal enableDelayedExpansion

:: Define the option names along with default values, using a <space>
:: delimiter between options. I'm using some generic option names, but 
:: normally each option would have a meaningful name.
::
:: Each option has the format -name:[default]
::
:: The option names are NOT case sensitive.
::
:: Options that have a default value expect the subsequent command line
:: argument to contain the value. If the option is not provided then the
:: option is set to the default. If the default contains spaces, contains
:: special characters, or starts with a colon, then it should be enclosed
:: within double quotes. The default can be undefined by specifying the
:: default as empty quotes "".
:: NOTE - defaults cannot contain * or ? with this solution.
::
:: Options that are specified without any default value are simply flags
:: that are either defined or undefined. All flags start out undefined by
:: default and become defined if the option is supplied.
::
:: The order of the definitions is not important.
::
set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"

:: Set the default option values
for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"

:loop
:: Validate and store the options, one at a time, using a loop.
:: Options start at arg 3 in this example. Each SHIFT is done starting at
:: the first option so required args are preserved.
::
if not "%~3"=="" (
  set "test=!options:*%~3:=! "
  if "!test!"=="!options! " (
    rem No substitution was made so this is an invalid option.
    rem Error handling goes here.
    rem I will simply echo an error message.
    echo Error: Invalid option %~3
  ) else if "!test:~0,1!"==" " (
    rem Set the flag option using the option name.
    rem The value doesn't matter, it just needs to be defined.
    set "%~3=1"
  ) else (
    rem Set the option value using the option as the name.
    rem and the next arg as the value
    set "%~3=%~4"
    shift /3
  )
  shift /3
  goto :loop
)

:: Now all supplied options are stored in variables whose names are the
:: option names. Missing options have the default value, or are undefined if
:: there is no default.
:: The required args are still available in %1 and %2 (and %0 is also preserved)
:: For this example I will simply echo all the option values,
:: assuming any variable starting with - is an option.
::
set -

:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!

Thực sự không có nhiều mã. Hầu hết đoạn mã trên là bình luận. Đây là mã chính xác, không có bình luận.

@echo off
setlocal enableDelayedExpansion

set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"

for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
:loop
if not "%~3"=="" (
  set "test=!options:*%~3:=! "
  if "!test!"=="!options! " (
      echo Error: Invalid option %~3
  ) else if "!test:~0,1!"==" " (
      set "%~3=1"
  ) else (
      set "%~3=%~4"
      shift /3
  )
  shift /3
  goto :loop
)
set -

:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!


Giải pháp này cung cấp các đối số kiểu Unix trong một lô Windows. Đây không phải là tiêu chuẩn cho Windows - hàng loạt thường có các tùy chọn đứng trước các đối số bắt buộc và các tùy chọn được đặt trước /.

Các kỹ thuật được sử dụng trong giải pháp này có thể dễ dàng điều chỉnh cho các tùy chọn kiểu Windows.

  • Vòng lặp phân tích cú pháp luôn tìm kiếm một tùy chọn tại %1và nó tiếp tục cho đến khi đối số 1 không bắt đầu bằng/
  • Lưu ý rằng các phép gán SET phải được đặt trong dấu ngoặc kép nếu tên bắt đầu bằng /.
    SET /VAR=VALUEkhông
    SET "/VAR=VALUE"hoạt động. Tôi vẫn đang làm điều này trong giải pháp của mình.
  • Kiểu Windows tiêu chuẩn loại trừ khả năng có giá trị đối số bắt buộc đầu tiên bắt đầu bằng /. Hạn chế này có thể được loại bỏ bằng cách sử dụng một //tùy chọn được xác định ngầm đóng vai trò như một tín hiệu để thoát khỏi vòng lặp phân tích cú pháp tùy chọn. Không có gì sẽ được lưu trữ cho //"tùy chọn".


Cập nhật 2015-12-28: Hỗ trợ !giá trị trong tùy chọn

Trong đoạn mã trên, mỗi đối số được mở rộng trong khi bật tính năng mở rộng bị trì hoãn, có nghĩa là đối số đó !rất có thể bị loại bỏ hoặc một cái gì đó tương tự !var!được mở rộng. Ngoài ra, ^cũng có thể bị tước nếu !có. Sửa đổi nhỏ sau đây đối với mã chưa được chú thích sẽ loại bỏ giới hạn đó !^được giữ nguyên trong các giá trị tùy chọn.

@echo off
setlocal enableDelayedExpansion

set "options=-username:/ -option2:"" -option3:"three word default" -flag1: -flag2:"

for %%O in (%options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
:loop
if not "%~3"=="" (
  set "test=!options:*%~3:=! "
  if "!test!"=="!options! " (
      echo Error: Invalid option %~3
  ) else if "!test:~0,1!"==" " (
      set "%~3=1"
  ) else (
      setlocal disableDelayedExpansion
      set "val=%~4"
      call :escapeVal
      setlocal enableDelayedExpansion
      for /f delims^=^ eol^= %%A in ("!val!") do endlocal&endlocal&set "%~3=%%A" !
      shift /3
  )
  shift /3
  goto :loop
)
goto :endArgs
:escapeVal
set "val=%val:^=^^%"
set "val=%val:!=^!%"
exit /b
:endArgs

set -

:: To get the value of a single parameter, just remember to include the `-`
echo The value of -username is: !-username!

Cảm ơn vì giải pháp rất đơn giản, tôi thích điều này hơn là một câu trả lời được chấp nhận. Chỉ có điều bạn bỏ lỡ là để nói làm thế nào để sử dụng các thông số có tên trong kịch bản hàng loạt, ví dụ echo% -username%
Roboblob

1
Giải pháp rất thanh lịch. Nếu bạn cân nhắc sử dụng điều này, hãy lưu ý rằng mã như được cung cấp sẽ bắt đầu phân tích cú pháp ở đối số 3. Đây không phải là điều bạn muốn trong trường hợp chung. Thay thế "3" bằng "1" để sửa lỗi này. @dbenham sẽ rất tuyệt nếu bạn có thể làm cho điều này rõ ràng hơn trong bài đăng gốc, tôi có lẽ không phải là người duy nhất bối rối lúc đầu.
ocroquette

@ocroquette - Điểm tốt. Tôi không có nhiều lựa chọn, vì tôi phải trả lời câu hỏi cụ thể. Nhưng mã phải được sửa đổi khi số lượng đối số vị trí bắt buộc thay đổi. Tôi sẽ cố gắng chỉnh sửa câu trả lời của mình để làm cho nó rõ ràng.
dbenham

Tôi thích điều này. Cảm ơn bạn về giải pháp, nó vẫn hoạt động trong năm 2019 khá rõ ràng đối với một số tập lệnh IDE!
Robert Smith

18

Nếu bạn muốn sử dụng các đối số tùy chọn, nhưng không phải đối số được đặt tên, thì phương pháp này phù hợp với tôi. Tôi nghĩ mã này dễ làm theo hơn nhiều.

REM Get argument values.  If not specified, use default values.
IF "%1"=="" ( SET "DatabaseServer=localhost" ) ELSE ( SET "DatabaseServer=%1" )
IF "%2"=="" ( SET "DatabaseName=MyDatabase" ) ELSE ( SET "DatabaseName=%2" )

REM Do work
ECHO Database Server = %DatabaseServer%
ECHO Database Name   = %DatabaseName%

IF "%1"==""sẽ không thành công nếu đối số chứa chính dấu ngoặc kép. Thay vào đó, chỉ cần sử dụng bất kỳ ký hiệu không đặc biệt nào khác, chẳng hạn như ._ = [] # etc
Fr0sT

2
Tôi không nghĩ điều này hoạt động trừ khi người dùng biết sử dụng "" thay cho một đối số. Nếu không, làm sao tôi có thể đặt tên DB nhưng lại để trống máy chủ DB?
Sean Long

Làm thế nào khác để bạn thấy một câu trả lời khác đạt được điều đó? @SeanLong
sehe

@SeanLong Đúng, vì vậy người dùng phải tuân theo lệnh. Vì vậy, bạn nên đặt các đối số bắt buộc nhất ở những vị trí đầu tiên.
Martin Braun

Đây chắc chắn là lựa chọn dễ dàng nhất đối với tôi. Cảm ơn vì đã đăng bài :)
Steve Bauman

2

Tạo biến động

nhập mô tả hình ảnh ở đây

Ưu điểm

  • Hoạt động cho> 9 đối số
  • Lưu giữ %1, %2... %*nguyên vẹn
  • Hoạt động cho cả hai /arg-argphong cách
  • Không có kiến ​​thức trước về các đối số
  • Thực hiện tách biệt với quy trình chính

Nhược điểm

  • Các đối số cũ có thể bị rò rỉ trong các lần chạy liên tiếp, do đó, hãy sử dụng setlocalđể xác định phạm vi cục bộ hoặc viết một :CLEAR-ARGSquy trình đi kèm !
  • Không bí danh hỗ trợ chưa (như --forceđể -f)
  • Không ""hỗ trợ đối số trống

Sử dụng

Dưới đây là một ví dụ về cách các đối số sau liên quan đến các biến .bat:

>> testargs.bat /b 3 -c /d /e /f /g /h /i /j /k /bar 5 /foo "c:\"

echo %*        | /b 3 -c /d /e /f /g /h /i /j /k /bar 5 /foo "c:\"
echo %ARG_FOO% | c:\
echo %ARG_A%   |
echo %ARG_B%   | 3
echo %ARG_C%   | 1
echo %ARG_D%   | 1

Thực hiện

@echo off
setlocal

CALL :ARG-PARSER %*

::Print examples
echo: ALL: %*
echo: FOO: %ARG_FOO%
echo: A:   %ARG_A%
echo: B:   %ARG_B%
echo: C:   %ARG_C%
echo: D:   %ARG_C%


::*********************************************************
:: Parse commandline arguments into sane variables
:: See the following scenario as usage example:
:: >> thisfile.bat /a /b "c:\" /c /foo 5
:: >> CALL :ARG-PARSER %*
:: ARG_a=1
:: ARG_b=c:\
:: ARG_c=1
:: ARG_foo=5
::*********************************************************
:ARG-PARSER
    ::Loop until two consecutive empty args
    :loopargs
        IF "%~1%~2" EQU "" GOTO :EOF

        set "arg1=%~1" 
        set "arg2=%~2"
        shift

        ::Allow either / or -
        set "tst1=%arg1:-=/%"
        if "%arg1%" NEQ "" (
            set "tst1=%tst1:~0,1%"
        ) ELSE (
            set "tst1="
        )

        set "tst2=%arg2:-=/%"
        if "%arg2%" NEQ "" (
            set "tst2=%tst2:~0,1%"
        ) ELSE (
            set "tst2="
        )


        ::Capture assignments (eg. /foo bar)
        IF "%tst1%" EQU "/"  IF "%tst2%" NEQ "/" IF "%tst2%" NEQ "" (
            set "ARG_%arg1:~1%=%arg2%"
            GOTO loopargs
        )

        ::Capture flags (eg. /foo)
        IF "%tst1%" EQU "/" (
            set "ARG_%arg1:~1%=1"
            GOTO loopargs
        )
    goto loopargs
GOTO :EOF


Bạn cũng có thể di chuyển nội dung của :ARG-PARSERquy trình sang tệp .bat bên ngoài arg-parser.batđể làm cho nó cũng có sẵn cho các tập lệnh khác.
Simon Streicher

1

Một khi tôi đã viết một chương trình xử lý các đối số ngắn (-h), dài (--help) và không phải tùy chọn trong tệp hàng loạt. Kỹ thuật này bao gồm:

  • đối số không phải tùy chọn theo sau là đối số tùy chọn.

  • toán tử shift cho những tùy chọn không có đối số như '--help'.

  • hai toán tử dịch chuyển thời gian cho những tùy chọn yêu cầu đối số.

  • lặp qua một nhãn để xử lý tất cả các đối số dòng lệnh.

  • Thoát tập lệnh và dừng xử lý đối với những tùy chọn không cần yêu cầu thêm hành động như '--help'.

  • Đã viết các chức năng trợ giúp để hướng dẫn người dùng

Đây là mã của tôi.

set BOARD=
set WORKSPACE=
set CFLAGS=
set LIB_INSTALL=true
set PREFIX=lib
set PROGRAM=install_boards

:initial
 set result=false
 if "%1" == "-h" set result=true
 if "%1" == "--help" set result=true
 if "%result%" == "true" (
 goto :usage
 )
 if "%1" == "-b" set result=true
 if "%1" == "--board" set result=true
 if "%result%" == "true" (
 goto :board_list
 )
 if "%1" == "-n" set result=true
 if "%1" == "--no-lib" set result=true
 if "%result%" == "true" (
 set LIB_INSTALL=false
 shift & goto :initial
 )
 if "%1" == "-c" set result=true
 if "%1" == "--cflag" set result=true
 if "%result%" == "true" (
 set CFLAGS=%2
 if not defined CFLAGS (
 echo %PROGRAM%: option requires an argument -- 'c'
 goto :try_usage
 )
 shift & shift & goto :initial
 )
 if "%1" == "-p" set result=true
 if "%1" == "--prefix" set result=true
 if "%result%" == "true" (
 set PREFIX=%2
 if not defined PREFIX (
 echo %PROGRAM%: option requires an argument -- 'p'
 goto :try_usage
 )
 shift & shift & goto :initial
 )

:: handle non-option arguments
set BOARD=%1
set WORKSPACE=%2

goto :eof


:: Help section

:usage
echo Usage: %PROGRAM% [OPTIONS]... BOARD... WORKSPACE
echo Install BOARD to WORKSPACE location.
echo WORKSPACE directory doesn't already exist!
echo.
echo Mandatory arguments to long options are mandatory for short options too.
echo   -h, --help                   display this help and exit
echo   -b, --boards                 inquire about available CS3 boards
echo   -c, --cflag=CFLAGS           making the CS3 BOARD libraries for CFLAGS
echo   -p. --prefix=PREFIX          install CS3 BOARD libraries in PREFIX
echo                                [lib]
echo   -n, --no-lib                 don't install CS3 BOARD libraries by default
goto :eof

:try_usage
echo Try '%PROGRAM% --help' for more information
goto :eof

1

Đây là trình phân tích cú pháp đối số. Bạn có thể kết hợp bất kỳ đối số chuỗi nào (được giữ nguyên) hoặc các tùy chọn thoát (đơn hoặc cặp tùy chọn / giá trị). Để kiểm tra nó, hãy bỏ ghi chú 2 câu lệnh cuối cùng và chạy như sau:

getargs anystr1 anystr2 /test$1 /test$2=123 /test$3 str anystr3

Escape char được định nghĩa là "_SEP_=/", xác định lại nếu cần.

@echo off

REM Command line argument parser. Format (both "=" and "space" separators are supported):
REM   anystring1 anystring2 /param1 /param2=value2 /param3 value3 [...] anystring3 anystring4
REM Returns enviroment variables as:
REM   param1=1
REM   param2=value2
REM   param3=value3
REM Leading and traling strings are preserved as %1, %2, %3 ... %9 parameters
REM but maximum total number of strings is 9 and max number of leading strings is 8
REM Number of parameters is not limited!

set _CNT_=1
set _SEP_=/

:PARSE

if %_CNT_%==1 set _PARAM1_=%1 & set _PARAM2_=%2
if %_CNT_%==2 set _PARAM1_=%2 & set _PARAM2_=%3
if %_CNT_%==3 set _PARAM1_=%3 & set _PARAM2_=%4
if %_CNT_%==4 set _PARAM1_=%4 & set _PARAM2_=%5
if %_CNT_%==5 set _PARAM1_=%5 & set _PARAM2_=%6
if %_CNT_%==6 set _PARAM1_=%6 & set _PARAM2_=%7
if %_CNT_%==7 set _PARAM1_=%7 & set _PARAM2_=%8
if %_CNT_%==8 set _PARAM1_=%8 & set _PARAM2_=%9

if "%_PARAM2_%"=="" set _PARAM2_=1

if "%_PARAM1_:~0,1%"=="%_SEP_%" (
  if "%_PARAM2_:~0,1%"=="%_SEP_%" (
    set %_PARAM1_:~1,-1%=1
    shift /%_CNT_%
  ) else (
    set %_PARAM1_:~1,-1%=%_PARAM2_%
    shift /%_CNT_%
    shift /%_CNT_%
  )
) else (
  set /a _CNT_+=1
)

if /i %_CNT_% LSS 9 goto :PARSE

set _PARAM1_=
set _PARAM2_=
set _CNT_=

rem getargs anystr1 anystr2 /test$1 /test$2=123 /test$3 str anystr3
rem set | find "test$"
rem echo %1 %2 %3 %4 %5 %6 %7 %8 %9

:EXIT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.