簡體   English   中英

批處理腳本傳遞多個參數進行調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM