2012-05-09 38 views
0

我試圖做到這一點在DOS CMD腳本:置換變量SET

@setlocal 
@for /L %%X in (1,1,10) do @call :label1 %%X 
@endlocal 
@exit /b 

:label1 
@set I=%1 
@set /P A%I%=SET A%I% to? 
@echo You entered %%A%%I%% 
exit /b 

但是我不能讓它呼應實際輸入的值。我已經嘗試了回波線上的所有變化。

誰能告訴我我做錯了什麼?

回答

1

要獲得輸出結果,可以使用call echo You entered %%A%I%%%

但是使用延遲擴展會更好,因此特殊字符如&和|永遠不會導致您的問題:echo You entered !A%I%!

爲了使用延遲擴展,您需要使用setlocal enableDelayedExpansion啓用它。

有用的提示1 - 將@echo off置於腳本的頂部。那麼你不需要在以下任何命令中使用@

有用的提示2 - 在使用SET/P之前,您應該明確地清除任何現有的變量值。您無法確定它尚未定義。如果用戶只需按下<Enter>而不輸入任何內容,則現有值將被保留。

有用的提示3 - 你甚至不需要I變量。您可以簡單地使用%1參數,只要您有%I%即可。

有用的提示4 - 更好的是,你甚至不需要調用子程序。

@echo off 
setlocal enableDelayedExpansion 
for /L %%X in (1,1,10) do (
    set "A%%X=" 
    set /P "A%%X=SET A%%X to? " 
    echo You entered !A%%X! 
) 
endlocal 
+0

感謝您的建議。第一個建議,%% A%I %%%,不起作用。它最終顯示:「您輸入了%A1%」,「您輸入了%A2%」等。但是,您的第二個建議沒有通話,確實有效。 –

+0

@Neilw - 嗯...... CALL echo %% A%I %%%'版本適用於我。你確定你把CALL放在你的ECHO之前?但是延遲擴展方法反正更好。 – dbenham

+0

噢好點。我忘了CALL eho。 在相關說明中,在您的delayedexpansion示例中,如何允許輸入特殊字符,如分號和逗號? –