使用 DISKPART 自动对磁盘进行分区并提示用户输入磁盘或退出
Automate partitioning a disk using DISKPART and prompting user for disk or quit
我需要创建一个批处理文件来对 USB 驱动器进行分区和格式化。这是制作一个Windows 7 USB启动盘。
DISKPART 是使用的工具,您将其传递给它的指令如下:
DISKPART /s instructions.txt
就我而言,我希望我的说明如下所示:
example prepdisk.txt
SELECT DISK <Prompt user to either enter a number or q for quit>
CLEAN
CREATE PARTITION PRIMARY
FORMAT QUICK FS=NTFS LABEL="Windows"
ACTIVE
ASSIGN LETTER="C"
然后我会有这样一个批处理文件:
prepdisk.bat:
DISKPART /s prepdisk.txt
但我一直卡在如何提示用户输入磁盘 ID 上。如果不确定,我也希望能够退出,因为显然格式化错误的驱动器可能很危险。
请参阅 set /?
帮助。您将需要使用 set /p var=promptText
来请求用户输入。用户键入的内容将存储在指示的变量中。
Diskpart
接受来自脚本文件和标准输入的命令。所以我们可以通过管道向它发送命令以向用户显示信息并检查选择。
以此为基础(另存为 .cmd
文件)并根据您的需要进行调整。
@echo off
setlocal enableextensions disabledelayedexpansion
:ask
rem select disk to format
call :showDiskTable
set /p "diskNumber=Type number of disk to format: " || goto :processCancelled
rem test disk selection
( echo select disk %diskNumber%
echo list disk
) | diskpart | findstr /b /c:"*" >nul || (
echo(
echo WRONG SELECTION
echo(
goto :ask
)
rem confirm disk selection
cls
call :showDiskTable
set "answer=%random%%random%"
set /p "confirm=If you are sure you want to format disk %diskNumber%, type %answer%:"
if not "%confirm%"=="%answer%" goto :processCancelled
rem Create script file
set "scriptFile=%temp%\%~nx0.%random%%random%%random%.tmp"
> "%scriptFile%" (
echo SELECT DISK %diskNumber%
echo CLEAN
echo CREATE PARTITION PRIMARY
echo FORMAT QUICK FS=NTFS LABEL="Windows"
echo ACTIVE
echo ASSIGN LETTER="C"
)
rem execute script file
type "%scriptFile%"
rem diskpart /s "%scriptFile%"
rem cleanup and exit
del /q "%scriptFile%"
echo(
echo DONE
echo(
exit /b 0
:showDiskTable
echo =====================================================
echo list disk | diskpart | findstr /b /c:" "
echo =====================================================
echo(
goto :eof
:processCancelled
echo(
echo PROCESS CANCELLED
echo(
exit /b 1
请注意,为了测试 diskpart /s file
已禁用,生成的脚本仅回显到控制台。当一切按预期工作时,删除 type
行(不需要)和 diskpart
之前的 rem
我觉得很有趣,但是如果你写:
set /a disknr=0
然后执行:
diskpart /s list.txt
当 list.txt 包含:
select disk %disknr%
list part
你得到同样好的结果。
我需要创建一个批处理文件来对 USB 驱动器进行分区和格式化。这是制作一个Windows 7 USB启动盘。
DISKPART 是使用的工具,您将其传递给它的指令如下:
DISKPART /s instructions.txt
就我而言,我希望我的说明如下所示:
example prepdisk.txt
SELECT DISK <Prompt user to either enter a number or q for quit>
CLEAN
CREATE PARTITION PRIMARY
FORMAT QUICK FS=NTFS LABEL="Windows"
ACTIVE
ASSIGN LETTER="C"
然后我会有这样一个批处理文件:
prepdisk.bat:
DISKPART /s prepdisk.txt
但我一直卡在如何提示用户输入磁盘 ID 上。如果不确定,我也希望能够退出,因为显然格式化错误的驱动器可能很危险。
请参阅 set /?
帮助。您将需要使用 set /p var=promptText
来请求用户输入。用户键入的内容将存储在指示的变量中。
Diskpart
接受来自脚本文件和标准输入的命令。所以我们可以通过管道向它发送命令以向用户显示信息并检查选择。
以此为基础(另存为 .cmd
文件)并根据您的需要进行调整。
@echo off
setlocal enableextensions disabledelayedexpansion
:ask
rem select disk to format
call :showDiskTable
set /p "diskNumber=Type number of disk to format: " || goto :processCancelled
rem test disk selection
( echo select disk %diskNumber%
echo list disk
) | diskpart | findstr /b /c:"*" >nul || (
echo(
echo WRONG SELECTION
echo(
goto :ask
)
rem confirm disk selection
cls
call :showDiskTable
set "answer=%random%%random%"
set /p "confirm=If you are sure you want to format disk %diskNumber%, type %answer%:"
if not "%confirm%"=="%answer%" goto :processCancelled
rem Create script file
set "scriptFile=%temp%\%~nx0.%random%%random%%random%.tmp"
> "%scriptFile%" (
echo SELECT DISK %diskNumber%
echo CLEAN
echo CREATE PARTITION PRIMARY
echo FORMAT QUICK FS=NTFS LABEL="Windows"
echo ACTIVE
echo ASSIGN LETTER="C"
)
rem execute script file
type "%scriptFile%"
rem diskpart /s "%scriptFile%"
rem cleanup and exit
del /q "%scriptFile%"
echo(
echo DONE
echo(
exit /b 0
:showDiskTable
echo =====================================================
echo list disk | diskpart | findstr /b /c:" "
echo =====================================================
echo(
goto :eof
:processCancelled
echo(
echo PROCESS CANCELLED
echo(
exit /b 1
请注意,为了测试 diskpart /s file
已禁用,生成的脚本仅回显到控制台。当一切按预期工作时,删除 type
行(不需要)和 diskpart
rem
我觉得很有趣,但是如果你写:
set /a disknr=0
然后执行:
diskpart /s list.txt
当 list.txt 包含:
select disk %disknr%
list part
你得到同样好的结果。