DiskPart 작업을 자동으로 처리하는 스크립팅

1. DiskPart 스크립트의 기초

DiskPart 는 명령을 자동으로 처리하는 스크립트 작업이 가능합니다.

DiskPart /s Script.txt


더 드릴 설명이 없습니다. 간단하게 다른 글에서 디스크를 정리하고 파티션을 생성하였던 작업을 하나 생각해보도록 하죠. 명령은 아래와 같았습니다.

diskpart
select volume=G
clean
create partition primary
format fs=ntfs quick label=WTG-Disk
active
assign letter=G
exit



이것을 스크립트로 처리해보도록 하겠습니다. 방법은 간단합니다. DiskPart 에서 행하는 명령들을 쭈욱 적은 텍스트 파일을 하나 만들고 그걸 불러오면 되는 겁니다. 아래와 같이 DiskPart 로 할 작업들을 순서대로 작성한 C:\TestScript.txt 라는 파일을 하나 생성합니다.

C:\TestScript.txt
select volume=G
clean
create partition primary
format fs=ntfs quick label=WTG-Disk
active
assign letter=G
exit



이렇게 스크립트 파일을 준비하였으면 이제 명령 프롬프트에서 설명하였던 것과 같이 DiskPart 를 스크립트 작업을 의미하는 /s 매개 변수를 추가하여 뒤에 작업에 사용할 스크립트용 텍스트 파일을 지정해주는 방식으로 실행하시면 됩니다.

diskpart /s C:\TestScript.txt





2. 스크립트 오류 상황에 대처하기

어떠한 경우엔 스크립트에 포함된 명령이 실패할 수도 있습니다. 그러면 DiskPart 스크립트 작업은 명령이 실패한 순간 바로 이후의 모든 작업을 취소하고 작업을 종료하게 됩니다. 간단하게 아래의 예를 보도록 하죠.

C:\TestScript2.txt
select disk=1
create partition extended
create partition logical
format fs=ntfs quick label=Data
assign letter=F
exit


이 스크립트에서 오류가 발생할 가능성은 무엇이 있을까요? 가장 간단하게 생각해볼 수 있는 문제가 이미 디스크 1 에 확장 파티션이 존재하는 경우를 들 수 있겠죠? 디스크에 확장 파티션은 하나만 존재할 수 있으니 이미 확장 파티션이 존재하는 경우엔 create partition extended 명령에서 작업이 중지되고 이후의 명령은 실행되지 못한채 작업이 종료되게 됩니다. 즉, 논리 드라이브는 생성도 못해본다는 것이죠.





그렇다면 이런 생각을 해볼 수 있습니다. 만약 확장 파티션이 없다면 확장 파티션을 만든 후 논리 드라이브를 생성하고 만약 확장 파티션이 이미 있다면 해당 확장 파티션에 곧바로 논리 드라이브를 생성하게끔 말이죠. 이는 간단하게 create partition extended 명령이 실패하더라도 나머지 명령을 실행하게 하는 것으로 해결을 볼 수 있겠죠?

그럴 때 사용하는게 바로 noerr 매개 변수입니다. noerr 매개 변수는 해당 명령이 실패하더라도 이를 무시하고 스크립트를 계속 진행하도록 해주는 매개 변수입니다.

C:\TestScript2.txt
select disk=1
create partition extended noerr
create partition logical
format fs=ntfs quick label=Data
assign letter=F
exit


위와 같이 스크립트 파일을 수정하고 동일한 상황에서 다시 스크립트 작업을 진행해보도록 하죠.





어떤가요? 오류 이후에도 작업을 계속 진행하여 이미 존재하고 있던 확장 파티션에 정상적으로 논리 드라이브가 생성되었죠? 하지만 주의해야 할 게 noerr 매개 변수는 적재 적소에 잘 활용하셔야 한다는 겁니다. 해당 명령이 실패한 후 다음 명령이 진행되면 전혀 엉뚱한 결과가 도출될 수도 있기 때문이죠.

또한 모든 명령이 noerr 매개 변수를 지원하는 것은 아닙니다. 해당 명령이 noerr 매개 변수를 지원하는지는 해당 명령의 도움말을 참고해보시면 됩니다. 도움말은 [DiskPart] DiskPart 의 도움말 보기 - Help 글을 참고하세요.




배치 파일에서 DiskPart 스크립트 처리하기

배치 파일에서 DiskPart 작업을 하기 위해선 스크립트 처리를 해야 합니다. 그래야만 배치 작업이 끊기지 않고 계속 진행될 테니까요. 미리 스크립트 파일을 만들어둬도 되지만 모든 상황에 맞춰 스크립트 파일을 미리 준비할 수도 없는 노릇이죠. 드라이브 문자나 디스크 번호 같은 걸 변수로 처리할 때도 난감하고요.

그럴 때는 특정한 문구를 화면에 출력해주는 Echo 명령과 이러한 출력을 텍스트 파일로 돌려주는 출력 리다이렉션 기능을 활용하면 됩니다. 즉, 배치 파일 자체에서 그 때 그 때 필요한 스크립트를 바로 만들고 이를 활용하는 거죠. 다 사용한 스크립트 파일은 Del 명령을 통해 지우면 되고요. 간단하게 예를 들어보죠.

Test.cmd
@echo off
pushd %~dp0

echo select disk=1 > "%temp%\Script.txt"
echo create partition extended noerr >> "%temp%\Script.txt"
echo create partition logical >> "%temp%\Script.txt"
echo format fs=ntfs quick label=Data >> "%temp%\Script.txt"
echo assign letter=F >> "%temp%\Script.txt"
echo exit >> "%temp%\Script.txt"

diskpart /s "%temp%\Script.txt"

del "%temp%\Script.txt" /q

exit


즉, Echo 명령과 출력 리다이렉션을(>, >>) 통해 즉석에서 Script.txt 파일을 준비하고 이를 통해 DiskPart 작업을 진행한 후 작업을 모두 마치면 이제 필요없어진 Script.txt 파일을 삭제하는 겁니다.


이게 유용한 것은 DiskPart 작업에 배치 파일의 변수를 활용할 수 있다는 겁니다. 예를 들어 그 때 그 때 다른 디스크를 선택해야 한다면 아래와 같이 디스크 번호를 변수로 처리하여 작업을 진행하면 되는 것이죠.

Test2.cmd
@echo off
pushd %~dp0

set /p Disk= (디스크 번호를 입력하세요) :

echo select disk=%Disk% > "%temp%\Script.txt"
echo create partition extended noerr >> "%temp%\Script.txt"
echo create partition logical >> "%temp%\Script.txt"
echo format fs=ntfs quick label=Data >> "%temp%\Script.txt"
echo assign letter=F >> "%temp%\Script.txt"
echo exit >> "%temp%\Script.txt"

diskpart /s "%temp%\Script.txt"

del "%temp%\Script.txt" /q

exit


물론 매우 단순하게 처리했지만 이렇게 하면 사용자에게 %Disk% 즉, 작업을 진행할 디스크를 직접 입력받고 이를 토대로 DiskPart 작업을 자동으로 진행하게 만들 수 있는 겁니다. 사용자가 1 을 입력하면 1 번 디스크를 2 를 입력하면 2 번 디스크에 해당 작업을 진행하게 만들 수 있는 것이죠.

사용자에게 입력 받을 수도 있고 여러 배치 파일적인 기술들을 활용하여 자동으로 처리하게끔 작업할 수도 있겠죠. 아무튼 배치 파일에서의 DiskPart 자동 처리 작업의 큰 틀은 이런 식으로 이루어지는 것입니다. 간단하죠?


사실 일반적인 분들에게 크게 활용할 일은 없는 글이었을텐데요. 그래도 저나 다른 배치 파일을 제작하는 많은 분들이 도대체 배치 파일로 DiskPart 의 작업을 어떻게 처리하는 것일까 궁금해하셨을 분들에게 이 글이 약간의 도움이 되었길 바라며 이번 글은 이쯤에서 마치도록 하겠습니다.

참고로 배치 파일 이야기가 나와서 드리는 말인데 배치 파일에 대해선 스누피님께서 정리를 잘해놓으셨더군요. 관련 글들을 읽어보시면 배치 파일을 이해하시는데에 많은 도움이 되실 겁니다.

스누피박스 - 배치 파일 기초 작성법
스누피박스 - For 구문 기초 사용법
스누피박스 - 배치파일에서 & 와 && 의 차이


사실 저도 이러한 매우 기초적인 문법들 외에 심오한 고급 문법들은 구사를 못합니다. ^^; 실력이 없다보니 사람을 피곤하게 만드는 IF - GOTO 무한 뺑뺑이를 즐겨 사용합니다. 매우 바람직하지 못한 코딩 방법이죠. 그래서 사실 제가 제작한 배치 파일들은 뜯어 보면 암울합니다......




 

 

신고
캐플 블로그에 공개된 글은 반드시 원본 글의 링크를 포함시키는 조건으로 자유롭게 이용하실 수 있습니다.
하지만 블로그의 발전을 위하여 되도록이면 링크로 글을 소개해주시길 부탁드립니다. ^^

- 상업적인 용도의 사이트는 대상에서 제외됩니다. -
- 글에는 오류가 있을 수 있고, 추후 수정 또는 재발행될 수 있습니다. -
  1. 돈워리 2012.07.19 23:50 신고  댓글주소  수정/삭제  댓글쓰기
    배치파일로 직접은 실행 할수 없어서 스크립트 작업으로 완성을 했군요.
    그래서 복잡해 보였는데...^^ 캐플님 설명으로 이해 못할 내용이 없어요.
    위 내용을 잘 이해했습니다.
    echo 명령으로 메시지를 화면에 출력하고.
    리다일렉션(>)으로 스크립트 파일를 만들고.
    리다일렉션(>>)으로 같은 파일이 있으면 밑에 붙여 넣어 하나의 스크립트 파일을 완성해서
    diskpart 작업을 실행.

    아!! 근데 스누피님 글이나 도움말로 익히기에 배치파일은 어렵다는 ///
    캐플님 특유의 설명이 곁들이면 바로 해결이 되는데 ....

    • BlogIcon CApple 2012.07.20 01:27 신고  댓글주소  수정/삭제
      배치 파일이 난감한 이유는 마땅히 더 설명할 게 없다는 겁니다. IF 나 For 와 같은 기초적인 것들을 알고 나면 이후부터는 끊임없이 자신이 직접 코드를 짜보면서 배우는 작업의 일환입니다. 그리고 남이 짜놓은 배치 파일을 얻을 수 있다면 그러한 배치 파일들을 뜯어보면서 이러한 과정에선 이러한 방식으로 처리를 하는 구나~ 라는 걸 직접 느껴야 하죠.

      배치 파일도 어찌보자면 프로그래밍과 비슷하여 "이럴 때는 이렇게 해야 한다!" 라는 것이 없습니다. 그래서 기본적인 명령을 설명하는 것 외에는 더 크게 나갈 수 있는 부분이 없습니다. 명령들을 익히고 그것들을 어떻게 조합할 것인지 때론 혼자 생각해보며 때론 다른 이들의 배치 파일을 참고하며 그렇게 스스로 연구하면서 익혀나가는 것 외에는 방법이 없죠. ^^;

      매우 원론적인 이야기이지만 이 이상 제가 더 드릴 수 있는 말이 없네요. ㅎㅎㅎ
  2. 가가멜 2013.02.14 16:20 신고  댓글주소  수정/삭제  댓글쓰기
    안녕하세요 우연찮게 캐플님 블로그에 들어와서 덕분에 쉽게 많은 정보 배우고 있습니다.
    그런데 몇가지 여쭤볼게 있어서 글올립니다.
    스크립트를 작성하여 diskpart 명령어를 제어하려고 하는데요

    create vdisk file=c:\disk.vhd maximum= 500
    sel vdisk file=c:\disk.vhd
    attach vdisk
    convert mbr
    create partition primary
    format fs=ntfs label="123" quick
    assign
    exit

    이렇게 스크립트 명령어로 실행하면 vhd파일을 생성하고 포맷하여 드라이브가 올라옵니다.
    그런데 드라이브가 잡히면서 포맷이 진행됬음에도 포맷해야 한다는 창과 드라이브가 올라오면서
    자동실행이 올라오는데 이것들을 막는 방법이 없을까요?
    (포맷창과 가상 드라이브의 자동실행만 막는 방법..)

    두번째 질문은 위에같은 스크립트로(위에는 label은 있지만.. ;;)
    드라이브 label이나 드라이브 letter를 지정하지 않았을때
    스크립트 명령어 만으로 어떤 드라이브 letter로 올라왔는지 인식하여 드라이브 letter를 변경한다거나
    일반 하드디스크 (C:, D: ..)와 가상 드라이브를 구별하는 방법이 있는지 도움을 청합니다.


    • BlogIcon CApple 2013.02.14 19:28 신고  댓글주소  수정/삭제
      1. 그건 제어판의 자동 실행 설정 쪽을 살펴봐야 할 듯 합니다.

      2. 현재 해당 파티션에 포커스가 있으니 assign 을 통해 드라이브 문자를 할당한 직후 detail partition 명령을 내리면 드라이브 문자가 표시됩니다. 이를 배치 파일의 for /F 명령에서 tokens 를 통해 추출하면 되지 않을까 생각되네요.
  3. BlogIcon IS 2013.06.07 14:20 신고  댓글주소  수정/삭제  댓글쓰기
    요즈음에는 >(리다이렉트)를 써버리면 마치 fopen(파일명, "w")를 실행한 것처럼 파일이 지워져버리고 새로 만들어진 다음 써지네요...
  4. 지나가다 2013.06.12 01:20 신고  댓글주소  수정/삭제  댓글쓰기
    이거 DiskPart에서 스크립트로 처리 하는 것(txt 파일 불러온느 것) 말인데요. Windows 8 DVD로 부팅한 상태에서 Shift+F10 누르면 나오는 명령 프롬프트 상태에서도 가능한가요??? 이거 궁금하네요. 웬지 안될 것 같기도 하고... VHD 부팅 이용해 보려고 매번 포맷 시 입력하는게 여간 귀찮아서 말입니다. ㅡㅡ; 자동으로 처리해 주면 무진장 좋을텐데요. 더불어 VHD 파일 생성까지 해준다면...ㅜㅜ
  5. BlogIcon 가르침 2016.03.23 12:37 신고  댓글주소  수정/삭제  댓글쓰기
    예전에 배치파일을 안들어 보고싶었는데 어려워서 포기했거든요 배치 파일 만드려는데 diakpart가 꼭 txt로불러와 실행해야 하는 이유가 있나요?

댓글을 달아 주세요

- 댓글에선 예의를 지켜주시기 바라며, 블로그지기는 댓글에서 따로 활동하지 않습니다.

* 티스토리 사용자는 여기를 클릭하시면 로그인 됩니다.

BBCode 안내   굵게 밑줄 기울임 취소선   취소선 취소선 취소선 취소선   왼쪽 정렬 가운데 정렬 오른쪽 정렬   코드박스 인용구 이미지   이미지 업로드-Imgur.com