SharedIT | 묻고 답하기(AMP)

.bat script 작성 관련 질문

안녕하세요. .bat script를 작성하던 중 잘 풀리지 않는 부분이 있어 질문을 드리게 되었습니다.

kisa 주요정보통신 기반시설 상세 가이드 W-16 IIS 링크 사용금지 항목 자동화 스크립트를 작성하던중 문제가 발생하였습니다. 

setlocal enabledelayedexpansion

%systemroot%\System32\inetsrv\appcmd list vdir | find /i "physicalPath" > filelist.txt

for /f "tokens=2 delims=(" %%G in (filelist.txt) do (

    set "cleanPath=%%G"

    set "cleanPath=!cleanPath:physicalPath:=!"

 set "cleanPath=!cleanPath:)=!"

    echo !cleanPath! > filelist2.txt

 )

for /f "tokens=*" %%H in (filelist2.txt) do (

Dir /o:n /s /a %%H > filelist3.txt

)

type filelist3.txt >> ..\%COMPUTERNAME%-%DATE%.xml


위 스크립트의 작성의도는 %systemroot%\System32\inetsrv\appcmd list vdir 명령을 이용하여 IIS의 홈 디렉터리 목록을 받아온 후  filelist.txt에 저장하고, 그 내용을 정제하여  filelist2.txt에 저장하고, filelist2.txt에 작성된 홈 디렉터리 경로를 dir 하여 filelist3.txt에 저장하고 filelist3.txt의 내용을 .xml파일에 추가하고자 하였습니다. 


그런데 for /f "tokens=*" %%H in (filelist2.txt) do (Dir /o:n /s /a %%H > filelist3.txt) 부분이 정상적으로 동작하지 않아 filelist3.txt에 내용이 입력되지 않고 있습니다.


오랜시간 매달려 보았지만 좀처럼 해결이 되지않아 질문을 드립니다.


감사합니다.

2개의 답변이 있습니다.

wansoo
  0 추천 | 9달 전

배치파일을 아래와 같이 해서 실행해 보세요.


setlocal enabledelayedexpansion

%systemroot%\System32\inetsrv\appcmd list vdir | find /i "physicalPath" > filelist.txt

echo. > filelist2.txt

for /f "tokens=2 delims=(" %%G in (filelist.txt) do (

    set "cleanPath=%%G"

    set "cleanPath=!cleanPath:physicalPath:=!"

    set "cleanPath=!cleanPath:)=!"

    echo !cleanPath! >> filelist2.txt

 )

echo. > filelist3.txt

for /f "tokens=*" %%H in (filelist2.txt) do (

  Dir /o:n /s /a %%H >> filelist3.txt

)

type filelist3.txt >> ..\%COMPUTERNAME%-%DATE%.xml

wansoo
  0 추천 | 9달 전

filelist2.txt의 파일에 내용이 어떻게 기록되어 있는지 확인되지 않아 정확하게 알기는 어렵지만...

대충 봤을때...


Dir /o:n /s /a %%H > filelist3.txt


문제가 있는 걸로 보여 집니다.


Dir /o:n /s /a %%H >> filelist3.txt


로 바꿔서 다시 시도해 보면 원하는 결과를 얻거나

문제 원인을 확인하는데 도움이 되지 않을까 싶어 보이네요.

ListenerMJ | 9달 전

답변 감사합니다. 큰 도움이 되었습니다.

filelist2.txt의 내용은

%systemdrive%\instpub\wwwroot

입니다.

filelist3.txt가 비어있는 내용은 해결되었으나 이번에는 filelist2.txt가 존재하는 디렉터리인

C:\Users\administrator\desktop\windows\batch 가 dir 되어 filelist3.txt에 입력되는 상황입니다.

혹시 이런 경우에는 어떤 문제가 원인이 될 수 있을까요?

wansoo | 9달 전

for /f "tokens=*" %%H in (filelist2.txt) do (

    Dir /o:n /s /a %%H > filelist3.txt

)


위의 명령을 수행 시킬때 filelist2.txt 안에 있는 하나 하나의 경로에 대해 dir 명령을 수행하지 않고, 처리하는 현재 작업 디렉터리에 대해 dir 명령을 수행시키는 원인을 알고 싶다는 내용인것 같네요.


( filelist2.txt를 생성할때 경로를 지정하지 않고 생성했기 때문에 현재 작업 디렉터리인 C:\Users\administrator\desktop\windows\batch에 filelist2.txt가 생성된 것이 되겠고요.  DOS 명령을 실행시킬때 특별하게 대상 경로를 지정하지 않을 경우에 기본 처리 대상 디렉터리는 현재 작업 디렉터리입니다. DOS 뿐만 아니라 유닉스, 리눅스,... 모두 동일합니다. )


그리고, 현재 작업 디렉터리에 대해 dir 명령을 수행 시키는 이유는 


for /f "tokens=*" %%H in (filelist2.txt) do (

    Dir /o:n /s /a %%H > filelist3.txt

)


명령에서 %%H 변수에 지정된 내용이 빈 공백이기 때문입니다. ( 공백이라는 것은 작업 대상 경로가 지정되지 않았기 때문에 기본 적용되는 현재 작업 디렉터리가 대상이 된다는 것이되겠고요. )


filelist2.txt에 기록되어 있는 한줄 한줄을 읽어서 %%H 변수에 집어 넣으면서 처리하는 작업인데, %%H에 빈공백이라는 건 filelist2.txt에 빈 공백 Line이 있기 때문이라 할 수 있겠고요.

filelist2에 내용이 어떻게 저장되어 있는지를 확인해 보아야 할 것 같은데...

filelist2.txt를 생성하는 명령에서도 >> 이 아닌 >을 사용했기 때문에 filelist2.txt에는 filelist.txt의 제일 마지막 줄 한개 라인만 저장되어 있을 걸로 보여지네요.

그리고, filelist.txt의 제일 마지막 줄이 빈 공백 라인일 것으로 추정되고요.



추가적으로 제시한 배치 파일에 추가적인 개선 사항을 지적해 보면...


위에 있는 for 반복문인,


for /f "tokens=2 delims=(" %%G in (filelist.txt) do (

    set "cleanPath=%%G"

    set "cleanPath=!cleanPath:physicalPath:=!"

    set "cleanPath=!cleanPath:)=!"

    echo !cleanPath! > filelist2.txt

 )

에서

filelist.txt에 저장되어 있는 한줄 한줄을 읽으면서 "(" 문자 이후에 있는 문자열을 가져와서

"physicalPath:"라는 문자열을 제거한 후에,

다시 닫는 괄호인 ")" 를 제거하여 filelist2.txt에다 내용을 기록해 두고...


다시 아래 for문인

for /f "tokens=*" %%H in (filelist2.txt) do (

    Dir /o:n /s /a %%H > filelist3.txt

)

을 이용하여  앞에서 filelist2.txt에 생성한 하나 하나의 Line에 대해서 dir 명령을 실행 시키는 작업을 반복하고 있는 작업을 하고 있는데...

굳이 앞의 for 반복문에서 파일을 생성하고 다시 아래 for 반복문으로 내용을 읽어 처리할 필요없이,

윗 for문에서 filelist2.txt에 저장하지말고 한번에 바로 dir 명령을 수행 시켜 버리는 것이 처리 성능 면에서나, 불필요한 파일 생성이 되지 않는 면에서나 코드가 간단해 진다는 여러가지의 장점을 얻을 수 있겠네요.


다시 말해

아래와 같이 for 반복문을 2번이나 실행할 필요없이 한번의 for 반복으로 처리해 버리는게 좋을 걸로 보여 지네요.


for /f "tokens=2 delims=(" %%G in (filelist.txt) do (

    set "cleanPath=%%G"

    set "cleanPath=!cleanPath:physicalPath:=!"

    set "cleanPath=!cleanPath:)=!"

    dir /o:n /s /a !cleanPath! >> filelist3.tx

 )

wansoo | 9달 전

제시한 전체 배치 파일을 아래와 같이 만드는게 깔끔하고, 관리도 쉽고, 처리 성능도 효율적일 걸로 보이네요.


setlocal enabledelayedexpansion

%systemroot%\System32\inetsrv\appcmd list vdir | find /i "physicalPath" > filelist.txt

echo.> filelist3.txt

for /f "tokens=2 delims=(" %%G in (filelist.txt) do (

    set "cleanPath=%%G"

    set "cleanPath=!cleanPath:physicalPath:=!"

    set "cleanPath=!cleanPath:)=!"

    dir /o:n /s /a !cleanPath! >> filelist3.tx

 )

type filelist3.txt >> ..\%COMPUTERNAME%-%DATE%.xml

ListenerMJ | 9달 전

답변 감사합니다. 문제가 잘 해결 되었습니다.