본문 바로가기

디스크와 파티션

[DiskPart] DiskPart 와 스크립팅, 배치 파일에서 DiskPart 작업을 처리하는 방법

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 무한 뺑뺑이를 즐겨 사용합니다. 매우 바람직하지 못한 코딩 방법이죠. 그래서 사실 제가 제작한 배치 파일들은 뜯어 보면 암울합니다......