배치 파일 for문에서 diskpart 실행
2024.09.01 11:50
------------------------------------------------------------------------------------------------------
출처: http://bbs.c3.wuyou.net/forum.php?mod=viewthread&tid=423983
구글 번역:
1. diskpart는 파이프라인을 통해 cmd 명령으로 전달된 diskpart 명령을 받을 수 있지만 명령이 여러 개인 경우 제대로 작동하지 않습니다.
2. 일반적으로 여러 diskpart 명령 세트의 경우 /s 매개변수를 통해 스크립트를 호출하거나 다음과 같은 파이프라인을 통해 스크립트를 완료합니다.
/s의 장점은 일부 diskpart 명령에 오류를 무시할 수 있는 noerr 매개 변수가 있다는 것입니다. 하지만 단점은 스크립트 파일을 미리 생성한 후 호출해야 한다는 점입니다.
오늘 저는 for를 사용하여 일련의 지침을 diskpart에 성공적으로 전달하려고 했습니다. 또한 diskpart에 전달한 다음 실행 결과를 분석 및 처리를 위해 중첩할 정보 흐름으로 사용할 수도 있습니다. 그러나 중첩된 for에는 특정 문자를 표시하려면 작은따옴표와 ^가 필요합니다.
===========================================================
1. 하나의 for 문에서 diskpart 명령 1개는 잘 되지만 같이 2개 이상 실행하면 에러가 납니다.
그러나 위의 스크립트를 이용하면 여러개를 함께 실행할 수가 있습니다.
- 배치 파일을 관리자 권한으로 실행하면 됩니다.
2. 메세지를 삭제하고 라인 수를 아래처럼 줄여도 되는군요.
-----------------------------------------------------------------------------------
@echo off
setlocal ENABLEDELAYEDEXPANSION
set n=0
for /f "delims=" %%c in ('^(for %%r in ^("list disk" "list vol" "sele disk 0" "list disk" "detail disk"
^) do @^(echo %%~r^)^)^|diskpart
') do (if "%%c"=="DISKPART> " (set /a n+=1&echo.) else (if !n! geq 1 echo %%c))
set /a n-=1
pause
-----------------------------------------------------------------------------------
3. 메세지를 삭제하고 하나의 for문에서 실행하기
-----------------------------------------------------------------------------------
@echo off
setlocal ENABLEDELAYEDEXPANSION
set n=0
set "diskpart_cmd=echo list disk ^& echo list vol ^& echo sele disk 0 ^& echo list disk ^& echo detail disk"
for /f "delims=" %%c in ('^(!diskpart_cmd!^)^|diskpart
') do (if "%%c"=="DISKPART> " (set /a n+=1&echo.) else (if !n! geq 1 echo %%c))
set /a n-=1
pause
-----------------------------------------------------------------------------------
댓글 [7]
-
cungice 2024.09.01 12:14
-
수채화 2024.09.01 12:28
이걸 보니 제가 사용하는 VHD 스크립트용 드라이브 문자 바꾸는거랑 엇비슷하네요. ㅋㅋ
@echo off
setlocal enabledelayedexpansion
set "tempFile=%temp%\diskpart_output.txt"
rem 인자가 두 개가 아닌 경우 오류 메시지 출력
if "%~2"=="" (
set "volumeName=VHD_EFI"
set "driveLetter=Z"
call :changeLetter
echo.
echo.
echo 사용법: %0 ^<볼륨 이름^> ^<드라이브 문자^>
echo 인자가 없거나 잘못되어 ^<VHD_EFI^> ^<Z^>으로 설정이 된 상태로 실행이 되었습니다.
goto EOF:
)
rem 인자 저장
set "volumeName=%~1"
set "driveLetter=%~2"
call :changeLetter
:EOF
endlocal
echo List Volume | diskpart
pause
exit
:changeLetter
rem 볼륨 목록을 나열하고 임시 파일에 저장
echo list volume | diskpart > %tempFile%
rem 지정된 볼륨 이름을 찾기
for /f "tokens=2,3 delims= " %%A in ('findstr /c:"%volumeName%" %tempFile%') do set volumeNumber=%%A
rem 볼륨 번호가 설정되지 않은 경우 오류 메시지 출력
if "%volumeNumber%"=="" (
echo 볼륨 "%volumeName%"을 찾을 수 없습니다.
del %tempFile%
exit /b 1
)
rem 지정된 드라이브 문자로 볼륨에 문자 할당
echo 볼륨 %volumeNumber%에 드라이브 문자 %driveLetter%를 할당 중...
(
echo select volume %volumeNumber%
echo assign letter=%driveLetter%
) | diskpart
rem 임시 파일 삭제
del %tempFile%
앞에 인자는 반드시 볼륨만 들어가는게 아니고 시스템 같은거 넣으면 EFI에 문자 넣어줍니다.
-
왕초보 2024.09.01 14:41
실제 활용하시는 소스 감사합니다...
-
머털 2024.09.01 12:54
수고하셨습니다
-
왕초보 2024.09.01 14:41
좋은 정보 감사합니다..
-
상발이 2024.09.01 16:00
수고하셨습니다.
-
피린이 2024.10.20 17:17
제가 이해한게 맞다면..
for 문으로 디스크파트의 여러 명령어를 처리할때 생기는 문제는 기본적으로 윈도우의 cmd가 병렬처리를 하기때문에 그럴거예요.
간단히 말해서 앞에서 실행한 명령어가 끝나기 전에 새로운 명령어를 처리하려고 들기때문에 오류가 발생하는 거라서
여러 명령어를 병렬처리하고 싶지 않을때는 cmd 의 quick edit mode (한글판의 빠른 편집 모드)를 비활성화 하셔도 되실겁니다.
https://i.sstatic.net/GGPXR.gif
수고 많으셨습니다. 감사합니다.