2017-12-27 3 views
0

다음 배치 스크립트 작업을 얻으려고했는데 배치에 대한 더 많은 전문 지식을 가진 사람에게 질문해야 할 것 같습니다. 단서가 없기 때문에 작동 안함. 나는 목록을 얻기 위해 노력하고배치 파일 : 중첩 루프의 목록 요소 작업

@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 

같이하기 : 내 의도는 목록 VAR의 두 가지 요소가 교체됩니다 얻는 것입니다

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

큰 for 루프를 if-else 분기/절 (호출되는 모든 항목)에 넣으면 여전히 작동해야합니다. – Poypoyan

+0

'% scnd % neq %% i'와 'if % fst % neq %% j'?를 의미합니다.'%% i '와'%% j '는이 시점에서 초기화되지 않았으므로 당신의 제안이 무엇인지 모르겠습니까? – user9145300

답변

0
된다

귀하의 문제는 %%i%i%은 완전히 다른 개의 변수 인 것으로 보입니다. %%i에 값을 할당 할 수 없습니다. for 명령 만 지정할 수 있습니다.

삽입 정렬을 수행하여 정렬 된 문자열 목록을 작성하려고 시도하는 것 같습니다. 코드 구조는 문제를 제시하기위한 편집의 유산 일 수 있지만 게시 될 때 루틴은 플로우 스루를 통해 다시 입력됩니다. 또한 :test 루틴은 setlocal/endlocal 대괄호로 묶이므로 list의 변경 사항은 :test 루틴 외부에서 볼 수 없습니다. 두 개의 setlocal 명령을 연속적으로 사용하면 두 개의 중첩 된 로컬 환경이 설정됩니다. setlocal 문에 옵션을 동시에 지정할 수 있습니다. setlocal이 스위치가 아닙니다 - 그것은 지역의 환경을 설정합니다 (그리고 예, 마이크로 소프트가 delayed expansion을 설정하도록 요청하고 echo on/off 같은 별도의 스위치 없음 형 작업 등 등)

또한 생성 된 목록이 선행 공백이 포함되어 있습니다 .

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%+ 

(I 문자열 list2의 끝을 보여주고 마지막에 +을 추가 한

REM


: 나는 다음과 같은 대체 루틴 그 생각을 따랐습니다. 예 - 원래 질문에 필요한 출력을 지정하면 문제를 쉽게 해결할 수 있습니다.

: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, 실마리 주셔서 감사합니다. 내가 필요한 것을 정확히 설명하지 못했던 것 같습니다 : 원본 스크립트는 목록 내에서 주어진 두 요소를 명확하게 바꿔야합니다. 목록을 정렬하는 방법을 알아 냈습니다 (예 :'sort'를 사용하거나'lss' 또는'leq' 등을 사용하여 예제를 작성하는 것과 같습니다). 여전히 문제는'%% i'와'%% j'를 스왑했을 때 다시 수집을 건너 뛰는 방법을 찾지 못했기 때문에'List'에 두 번 입력했기 때문입니다. 이 문제를 해결하는 방법을 알아 보겠습니다. – user9145300

+0

아마도 시작 목록이 주어지면 원하는 결과 목록이 무엇인지 말해야합니다. – Magoo

+0

죄송합니다. 질문에 직접 대답 했어야합니다. 나는 List를 얻으 려하고있다 :'abcd efgh ijkl mnopq qwert rstvw yxcva rtzewrw yxvys' 여기서'fst' (첫 번째 요소)와'scnd' (두 번째 요소)는 바뀌게됩니다. 앞서 언급 한 원래의 질문에서와 같이, 그들은 이미 바뀌었지만, 그 후에 그들은 List에 다시 밀어 넣습니다. 따라서 이중 엔트리는 ... – user9145300

관련 문제