2013-02-17 52 views
1

我有一個變量,充當一行打印,但我需要通過它們在行中的位置編輯該行中的單個字符。不過,我需要使用變量來指定每次的位置,CMD以錯誤的方式解釋我的變量。如何使用變量中的值分割字符串? (批)

@echo off 
    set fv=0 
    set fh=1 
    set /a fh1=%fh%+1 
    set linev=line%fv% 

    set line%fv%=%linev:~0,%fh%%%NEWCHARACTER%%linev:~%fh1%% 

對不起,我的代碼是混亂的,但我希望它被理解。 我希望CMD將代碼解釋爲:
%fv%%fh%%newcharacter%%fh1%然後將兩個字符串操縱器轉換爲子字符串。

+0

我不確定要達到什麼效果,但是您是否搜索FOR/F,請參閱http://ss64.com/nt/for_cmd.html – 2013-02-17 14:06:05

回答

2

我不確定我是否理解了腳本樣例最後一行中的評估順序,即使是您的口頭解釋。不過,我想至少我可以通過簡單的例子向你展示如何實現你想要的東西,並且你將研究如何在你的情況下應用這種技術。

基本上,你需要在這裏使用兩種擴展:立即(或者%擴展)並延遲。

在批處理文件中存在延遲擴展,必須首先啓用(通常使用命令SETLOCAL EnableDelayedExpansion),然後使用!而不是%進行變量評估。考慮下面的例子:

SET ind=1 
SET line%ind%=ABC 
SETLOCAL EnableDelayedExpansion 
ECHO !line%ind%! 
ENDLOCAL 

在上述例子中,兩個變量被創建,indline1。第二個名字部分用第一個變量構造。當你爲設置這個變量的值時,不需要延遲擴展,因爲不需要評估賦值的左側部分名稱。但是當它需要評估時,你需要使用延遲擴展。在上述腳本中的命令ECHO這樣工作的:

  • %ind%首先計算;

  • 作爲%ind%評價的結果,該命令變爲ECHO !line1!;

  • 由於延遲擴展剛剛被啓用,!現在具有特殊的意義,即(延遲的)變量的評價,所以!line1!計算結果爲ABC;

  • ECHO打印ABC

儘管這種延遲擴展是最常見的優選的,在上述例子中也可以使用CALL -expansion實現相同的。下面是重寫使用CALL -expansion同樣的例子腳本:

SET ind=1 
SET line%ind%=ABC 
CALL ECHO %%line%ind%%% 

基本上,有%擴張一路,但不同地區在不同的時間進行評估。下面是第二個例子中的延遲評價是如何工作的:

  • 第一%%變成%;

  • %ind%評估爲1;

  • 其餘%%變成%;

  • CALL現在接收到要執行的命令:ECHO %line1%;

  • %line1%評估爲ABC;

  • ECHO打印ABC

CALL擴展比較慢,這可能特別表現在循環中。另一方面,!擴展具有一些含義,特別是因爲使用SETLOCAL命令來啓用語法。關於my answer to a different question的話題還有更多。