배치 파일 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
-----------------------------------------------------------------------------------
댓글 [6]
-
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
수고하셨습니다.
수고 많으셨습니다. 감사합니다.