2017-12-27 371 views
0

我一直在試圖獲得批處理腳本的工作,看起來像我需要問一個在批處理方面有更多專業知識的人,因爲我沒有任何線索,爲什麼它保留不工作。我的目的是獲取列表VAR的兩個元素被交換:批處理文件:使用嵌套循環中的列表元素

@echo off 

    rem enable delayed expansion, required for extended usage of environment variables 
    SETLOCAL EnableDelayedExpansion 
    SETLOCAL EnableExtensions 

    set VAR=abcd efgh ijkl mnopq rstvw qwert yxcva rtzewrw yxvys 
    set fst=qwert 
    set scnd=rstvw 

    call :test %VAR% 

    :test 
    SETLOCAL 

    for %%i in (%*) do (
     for %%j in (%* %%i) do (
      if %scnd% equ %%i (
       if %fst% equ %%j (
       echo "gotcha before swapping: " "i: " %%i "j: " %%j 
        set tempor=%%i 
        set i=%%j 
        set j=!tempor! 
        echo "gotcha after swapping: " "i: " !i! "j: " !j!   
        set List=!List! %%j %%i 
       ) 
      ) 
     ) 
     set List=!List! %%i 
     echo "List: " !List! 
    ) 

    ENDLOCAL 
    goto :eof 

    :ende 

我試圖讓列表看起來像這樣:

abcd efgh ijkl mnopq qwert rstvw yxcva rtzewrw yxvys 

在FST(爲第一要素)和SCND (第二個元素)被交換。

輸出是這樣的:"List: " abcd efgh ijkl mnopq qwert rstvw rstvw qwert yxcva rtzewrw yxvys,所以我得到的qwertrstvw複式,我知道那是因爲set List=!List! %%i位置。

至少我知道,交換正在工作。 但我的問題是:如果我把這個在else分支,因爲我通常會在任何其他的腳本語言來做,列表將充滿在每個循環%%i%%j,所以就顯得無用武之地....

+0

如果你把一個if-else分支/子句中的big for循環(不管它叫什麼),它應該仍然有效。 – Poypoyan

+0

你的意思是由'if%scnd%neq %% i'和'if%fst%neq %% j' ?,'%% i'和'%% j'在這一點上還沒有被初始化,所以我不太明白你的建議是什麼? – user9145300

回答

0

您的問題似乎是%%i%i%完全是不同變量。您不能將值分配給%%i - 只有for命令可以。

您似乎試圖執行插入排序來構建排序的字符串列表。您的代碼結構可能是編輯遺留下來的問題,但在發佈後,該例程將通過流程重新輸入。此外,由於例程:test被包含在setlocal/endlocal括號中,所以在:test例程之外將不會看到對list的更改。並且連續有兩個setlocal命令創建兩個嵌套的本地環境。 兩個的選項可以在一個setlocal聲明中同時指定。需要注意的是setlocal是不是交換機 - 它建立了一個本地環境(是的,微軟已經要求建立delayed expansion等作爲像echo on/off獨立的馬桶蓋式操作)

另外請注意,您生成的列表中包含一個前導空格。我注視着下面的替代例程想法:

REM

SET "list2=" 
for %%i in (%*) do (
REM %%i has each element in turn 
SET "startlist= " 
SET "endlist= " 
IF defined list2 for %%j in (!list2!) do (
    IF "%%j" lss "%%i" (
    SET "startlist=!startlist!%%j " 
) ELSE (
    SET "endlist=!endlist!%%j " 
) 
) 
SET "list2=!startlist!%%i!endlist:~0,-1!" 
) 
ECHO "List2:" %list2%+ 

(我已經添加了+到最後顯示的字符串list2結束


。是 - 在原始問題中指定所需的輸出使問題容易解決

:test 
SETLOCAL 
SET "List=" 
for %%i in (%*) do (
if %fst% equ %%i (SET "List=!List! %scnd%" 
) ELSE (
    if %scnd% equ %%i (SET "List=!List! %fst%" 
) ELSE set List=!List! %%i 
) 
echo "List: " !List! 
) 
ENDLOCAL 
goto :eof 

我假設缺少信息,否則保證fstscnd都保證在輸入中只出現一次。

+0

嗨magoo,謝謝你的線索。它看起來像我沒有正確解釋我需要什麼:原始腳本應該definitly交換列表中的兩個給定的元素。我已經想出瞭如何對列表進行排序(例如使用'sort',或者像使用'lss'或'leq'等示例)。仍然是我的問題是,我無法知道如何在我交換時跳過收集'%% i'和'%% j''',因此'List'中的重複條目。讓我們看看如何解決這個問題... – user9145300

+0

也許你應該告訴我們你的期望結果列表應該是什麼,給出你的出發名單。 – Magoo

+0

當然,對不起,我應該直接在問題中完成。我試圖讓列表看起來像這樣:'abcd efgh ijkl mnopq qwert rstvw yxcva rtzewrw yxvys'其中'fst'(用於第一個元素)和'scnd'(第二個元素)被交換。就像我剛纔提到的原始問題一樣,它們已經被交換,但之後它們再次被推入列表中,因此重複輸入... – user9145300