[英]Batch script pass multiple parameters to call
我編寫了一個腳本,其中包含一個函數,該函數應循環遍歷列表並返回給定所述列表中項目索引的值。 我有一個名為:: :find
的函數應該采用2個參數:列表和項目位置。 我不確定如何處理函數中的多個參數。 如果我在循環中用%MY_LIST%
替換%LIST%
並且從參數列表中刪除%MY_LIST%
,則該腳本運行正常,並將其傳遞給call :find
,但我真的想知道如何傳遞多個參數。 我認為它們只是作為整個字符串傳遞給函數...
@echo off
setlocal enableDelayedExpansion
cls
:: ----------------------------------------------------------
:: Variable declarations
:: ----------------------------------------------------------
set RETURN=-1
set MY_LIST=("foo" "bar" "baz")
set TARGET_INDEX=1
:: ----------------------------------------------------------
:: Main procedure
:: ----------------------------------------------------------
call :log "Finding item %TARGET_INDEX%..."
call :find %MY_LIST% %TARGET_INDEX%
call :log "The value is: %RETURN%"
goto Exit
:: ----------------------------------------------------------
:: Function declarations
:: ----------------------------------------------------------
:find
call :log "Called `:find` with params: [%*]"
set /a i=0
set LIST=%~1 & shift
for %%a in %LIST% do (
if !i! == %~1 (
set RETURN=%%a
)
set /a i=!i!+1
)
goto:EOF
:printDate
for /f "tokens=2-4 delims=/ " %%a in ('echo %DATE%') do (
set mydate=%%c/%%a/%%b)
for /f "tokens=1-3 delims=/:./ " %%a in ('echo %TIME%') do (
set mytime=%%a:%%b:%%c)
echo|set /p="[%mydate% %mytime%] "
goto:EOF
:log
call :printDate
echo %~1
goto:EOF
:: ----------------------------------------------------------
:: End of script
:: ----------------------------------------------------------
:Exit
更新
我的腳本現在運行正常; 感謝nephi12。 http://pastebin.com/xGdFWmnM
call :find "%MY_LIST%" %TARGET_INDEX%
goto :EOF
:find
echo %~1 %~2
goto :EOF
它們與args一樣傳遞給腳本... ;)
這是另一種在空格分隔的值列表上執行索引查找的方法。 定義列表而不括括號。 單詞不需要引用。 必須引用帶有空格,制表符,分號或相等的短語。 還包含特殊字符的值,如&
和|
應該引用。
然后顛倒你的:FIND參數的順序 - 首先是索引,然后是實際的列表。 在FOR / L循環中使用SHIFT可將所需的索引值轉換為第一個參數。
此解決方案的一個優點是它可以支持任意數量的值,只要它們符合每行8191個字符的限制。 nephi12解決方案限於9個值。
@echo off
setlocal
set MY_LIST=foo bar baz "Hello world!"
call :find %~1 %MY_LIST%
echo return=%return%
exit /b
:find index list...
for /L %%N in (1 1 %~1) do shift /1
set "return=%~1"
exit /b
試試這個,我認為它可以回答你的問題。 把它放在一個bat文件中,然后在看到這個工作后再構建你需要的任何東西。 使用命令提示符中的帶引號的字符串執行它。 YourBatFile“Arg1 Arg2 Arg3 Etc”
@echo off
call :DoSomethingWithEach %~1
goto :eof
:DoSomethingWithEach
for %%a in (%*) do echo.%%a
goto :eof
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.