简体   繁体   English

将命令参数保存到数组批处理

[英]Saving command arguments to array batch

I'm looking for a way to create an array of the arguments the batch receives. 我正在寻找一种创建批处理接收的参数数组的方法。

Example: If I run bfile.bat 1 2 3 4 5 I'll have an array with the 5 cells 1, 2, 3, 4, 5 . 示例:如果我运行bfile.bat 1 2 3 4 5我将有一个包含5个单元格1, 2, 3, 4, 5的数组。

Any ideas? 有任何想法吗?

Windows batch scripting doesn't really include functionality for arrays, in that there are no array member functions for sorting, length, etc as in other languages. Windows批处理脚本实际上并没有包含用于数组的功能,因为没有像其他语言那样用于排序,长度等的数组成员函数。 Aacini has written a thorough expository on the matter. 阿西尼(Aacini)已就此事撰写了详尽的说明

Having said that, you can simulate arrays well enough to accomplish what you describe. 话虽如此,您可以很好地模拟数组以完成您描述的内容。

@echo off
:: arr.bat -- simulates creation of an array with script arguments
setlocal enabledelayedexpansion

set args=%*
set arr.length=0

rem delayed expansion of %args% here to prevent if statement from freaking out
rem if quotation marks or spaces are encountered
if #!args!==# goto :usage

rem ###############
rem construct array
rem ###############

rem surround each argument with quotation marks and loop through them
rem 1 "2 3" 4 becomes "1" ""2" "3"" "4" (keeping 2 and 3 grouped)
for %%I in ("%args: =" "%") do (

    rem Pop quiz, hotshot.  Why did I not just use `set arr[!arr.length!]=%%~I`
    rem to strip the quotation marks?  Try it and see what happens.
    set val=%%I
    set arr[!arr.length!]=!val:"=!

    rem incrememt %array.length%
    set /a arr.length=!arr.length! + 1
)

rem ##############
rem retrieve array
rem ##############

echo arr[] has a length of %arr.length%.

rem arr.Ubound is the highest index in the array.  For instance, if the array
rem has 4 elements, then !arr[%arr.Ubound%]! refers to %arr[3]%.
set /a arr.Ubound=%arr.length% - 1
for /L %%I in (0, 1, %arr.Ubound%) do (

    rem To retrieve an array element, expand the inner variable immediately
    rem while delaying expansion of the outer variable.
    echo arr[%%I] = !arr[%%I]!
)

goto :EOF

:usage
echo Usage: %~nx0 [arg [arg [arg]]] etc.

Here's some example output. 这是一些示例输出。

C:\Users\me\Desktop>arr
Usage: arr.bat [arg [arg [arg]]] etc.

C:\Users\me\Desktop>arr 1 "2 3" 4
arr[] has a length of 3.
arr[0] = 1
arr[1] = 2 3
arr[2] = 4

C:\Users\me\Desktop>arr the quick brown fox jumps over the lazy dog, and so forth.
arr[] has a length of 12.
arr[0] = the
arr[1] = quick
arr[2] = brown
arr[3] = fox
arr[4] = jumps
arr[5] = over
arr[6] = the
arr[7] = lazy
arr[8] = dog,
arr[9] = and
arr[10] = so
arr[11] = forth.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM