2017-06-21 66 views
1

我無法訪問下面示例中存儲的值。我需要訪問存儲在變量中的值,但變量名稱存儲在另一個變量中。請幫忙。批處理腳本 - 如何使用存儲變量名的其他變量獲取變量值

實施例:

setlocal enabledelayedexpansion 

set a222333password=hellopass 

for %%i in (%fileserver%\t*) do ( 
    set currentfilename=%%~ni --> file name is "t222333" 
    set currentlogin=!currentfilename:t=a! --> login is "a222333" 
    set currentpasswd=!!currentlogin!password! --> password should be "hellopass" 
    echo !currentpasswd! --> this gives me the value "a222333password" instead of "hellopass" 

) 
+0

這種類型的管理解釋在[這個答案](https://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch -script/10167990#10167990),但主題不同。 – Aacini

回答

2

不能巢延遲像set currentpasswd=!!currentlogin!password!擴張,因爲該第一檢測!!,其被組合成一個開口!,所以變量擴展!currentlogin!完成導致a222333,則有是文字部分password,最後是另一個不能配對的!,因此被忽略。

但是,你可以試試這個,因爲call再次發起解析階段:

call set "currentpasswd=%%!currentlogin!password%%" 

還是這個,因爲for變量引用成爲擴大發生前延遲了擴展:

for /F "delims=" %%Z in ("!currentlogin!") do set "currentpasswd=!%%Zpassword!" 

或者也是這個,因爲參數引用(如正常擴展變量(%擴展))在延遲擴展完成之前被擴展:

rem // Instead of `set currentpasswd=!!currentlogin!password!`: 
call :SUBROUTINE currentpasswd "!currentlogin!" 

rem // Then, at the end of your current script: 
goto :EOF 

:SUBROUTINE 
set "%~1=!%~2password!" 
goto :EOF 

rem // Alternatively, when you do not want to pass any arguments to the sub-routine: 
:SUBROUTINE 
set "currentpasswd=!%currentlogin%password!" 
goto :EOF 

所有這些變體有兩個共同的重要的事情:

  1. 有發生兩種擴張階段;
  2. 內部變量引用在外部引用之前展開;
相關問題