2014-06-10 2 views
0

배치 파일을 사용하여 속성 파일을 업데이트하려고합니다. 키 "comp.array"에는 "comp1, comp2, machine2, state1"과 같은 값이 들어 있습니다 (이것은 단지 샘플 값이지만 실제로는 매우 길다). 이 배치 파일을 완료하는 데 필요한 다음 요점이 있습니다. 정렬 부분은 내가 곤경에 처해있는 곳이다. 웹에서 사용할 수있는 예제에서 정렬은 명령 행에서 숫자 배열 또는 사용자가 지정한 입력 배열에서 수행됩니다. 내부적으로 생성 된 배열을 어떻게 정렬 할 수 있습니까?배치에서 텍스트 배열 정렬

  • 오름차순으로
  • (완료) 종료시 정렬 새로운 값을 추가 (완료) 문자열
  • 는 (완료) 배열로 변환로 comp.array의 값을 취득 순서 (할일)
  • 변환 쉼표로 구분 된 문자열로 배열 다시 키에 할당합니다. (할일)

    @echo off 
    SETLOCAL EnableExtensions 
    SETLOCAL EnableDelayedExpansion 
    
    SET PKEY=comp.array 
    SET PVAL=myval 
    SET FILE=app.properties 
    
    FINDSTR /B %PKEY% %FILE% >nul 
    IF %ERRORLEVEL% EQU 1 (
        ECHO No matching Key %PKEY% in %FILE%. Exiting.. 
        EXIT 0 
    ) 
    MOVE /Y "%FILE%" "%FILE%.tmp" 
    FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%FILE%.tmp" ^|FIND /N /I "%PKEY%"`) DO (
        SET LINE=%%A 
    ) 
    SET VALUE=%LINE:~18% 
    ECHO %VALUE% 
    
    SET /A J=0 
    SET VALARR[0]="" 
    FOR %%i in (%VALUE%) do (
        SET VALARR[!J!]=%%i 
        SET /A J+=1 
    ) 
    SET VALARR[!J!]=%PVAL% 
    
    for /l %%n in (0,1,!J!) do (
        echo !VALARR[%%n]! 
    ) 
    
    :: PLACE TO ADD SORT LOGIC 
    
    FOR /F "tokens=1,2* delims=]" %%S in ("%LINE%") DO SET LINE=%%S 
    SET /A LINE=%LINE:~1,6% 
    SET /A COUNT=1 
    FOR /F "USEBACKQ tokens=*" %%A IN (`FIND /V "" ^<"%FILE%.bak"`) DO (
        IF "!COUNT!" NEQ "%LINE%" (
         ECHO %%A>>"%FILE%" 
        ) ELSE (
         ECHO %PKEY%=%PVAL%>>"%FILE%" 
        ) 
        SET /A COUNT+=1 
    ) 
    

답변

1
@echo off 
    setlocal enabledelayedexpansion 

    set "var=one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve" 
    set "out=" 

    :: separate the elements, sort and concatenate again 
    for /f "delims=" %%a in (
     'cmd /q /c "for %%a in (%var%) do echo(%%a"^|sort' 
    ) do set "out=!out!,%%a" 

    :: there is an initial comma to delete 
    set "out=%out:~1%" 
    echo %out% 
1

표준 sort 명령을 사용할 수 있습니다. 아래의 코드는 오름차순으로 VALARR 배열을 정렬하고 쉼표로 구분 된 문자열로 결과를 변환 :

(for /L %%n in (0,1,%J%) do echo !VALARR[%%n]!) | sort > sorted.txt 
set "string=" 
for /F "delims=" %%a in (sorted.txt) do set "string=!string!,%%a" 
rem Eliminate the first comma: 
set "string=%string:~1%"