2013-10-22 57 views
2

我已經編寫了一個腳本,其中包含一個函數,該函數應循環顯示列表並返回給定列表中項目索引的值。我有一個叫做::find的函數,它應該有兩個參數:列表和項目位置。我不確定如何處理函數中的多個參數。這個腳本運行良好,如果我在循環內替換%LIST%%MY_LIST%,並從參數列表中刪除%MY_LIST% tht傳遞給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

回答

6
call :find "%MY_LIST%" %TARGET_INDEX% 
goto :EOF 

:find 
echo %~1 %~2 
goto :EOF 

它們傳遞相同的參數傳遞給腳本... ;)

+0

工作。謝謝,但你知道它爲什麼有效嗎?另外,這裏是我的工作腳本! http://pastebin.com/xGdFWmnM –

+1

「的傳遞作爲一個參數,引號和所有。在〜%〜1刪除報價,如果他們在那裏。 – nephi12

+0

劇本看起來不錯!它很好地放在一起,並且高效 – nephi12

2

試試這個,我覺得這回答你的問題。把它放在一個bat文件中,然後在你看到這個工作後建立你需要的任何東西。用命令提示符中的帶引號的字符串執行它。 YourBatFile「ARG1參數3等」

@echo off 
call :DoSomethingWithEach %~1 
goto :eof 

:DoSomethingWithEach 
for %%a in (%*) do echo.%%a 
goto :eof 
4

這裏是做價值的空間分隔的列表中的索引查找另一種方法。定義列表而不用括號括起來。單詞不需要被引用。必須引用帶空格,製表符,分號或相等的短語。還應引用帶有特殊字符(如&|)的值。

然後顛倒你的: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