[英]Saving command arguments to array batch
我正在尋找一種創建批處理接收的參數數組的方法。
示例:如果我運行bfile.bat 1 2 3 4 5
我將有一個包含5個單元格1, 2, 3, 4, 5
的數組。
有任何想法嗎?
Windows批處理腳本實際上並沒有包含用於數組的功能,因為沒有像其他語言那樣用於排序,長度等的數組成員函數。 阿西尼(Aacini)已就此事撰寫了詳盡的說明 。
話雖如此,您可以很好地模擬數組以完成您描述的內容。
@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.
這是一些示例輸出。
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.