我尝试仅当特定分区至少达到一定大小时才执行批处理文件的一部分。我在这里找到了一个在批处理文件中使用 diskpart 的示例:https://stackoverflow.com/questions/18477576/get-the-amount-of-partitions-on-a-disk-0-using-batch-file
但当我尝试修改它以获取我需要的东西时,它完全停止工作。我已缩减到仅此而已:
@ECHO OFF
ECHO select disk 0 > temp.scr
ECHO list partition >> temp.scr
diskpart /s temp.scr | findstr /r "Partition.[0-9]" > temp.txt
pause
根据我对原始工作方式的看法,这不应该将使用正则表达式找到的字符串输出到 temp.txt 吗?无论我怎么尝试,temp.exe 都是空的。
无论如何,最终目标是将批处理文件加载到 winPE 映像中,然后使用 startnet.cmd 自动运行。此批处理文件将查看磁盘上的每个分区,找到相关分区(在本例中大于 ~200 gb),然后格式化该分区,然后运行一些我已经制作并运行的批处理文件。
答案1
For
该批处理文件将抓取所有分区记录,并将它们解析为命令中的一系列临时环境变量
@Echo Off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
(
ECHO list disk
ECHO select disk 0
ECHO list partition
) > %~dp0temp.scr
For /F "usebackq tokens=2,3,4,5,6,7" %%P IN (`diskpart /s %~dp0temp.scr ^| findstr /r "Partition.[0-9]"`) DO (
If /i "%%S" EQU "KB" (
REM Skip drives sized in KiloBytes
) Else If /i "%%S" EQU "MB" (
REM Skip drives sized in MegaBytes
) Else (
REM GB/TB
If /i "%%S" EQU "GB" Set /A intSize=%%R * 1
If /i "%%S" EQU "TB" Set /A intSize=%%R * 1024
If !intSize! GEQ 200 (
Echo Partition %%P Type %%Q Size !intSize! GB Offset %%T %%U
Call :s_Work_Partition %%P
)
)
)
ENDLOCAL
pause
Goto :EOF
:s_Work_Partition
REM First parameter is disk partition number
If "%~1" EQU "" Goto :EOF
:: %~1 contains the partition number from disk 0
:: it can be used to run any disk command within this command block.
Goto :EOF
在命令主体中,For
您可以完全自由地使用来自进程的令牌数据DiskPart
。您必须以管理员身份运行此批处理文件,否则它将无法正常工作。
由于该DiskPart
命令使用 KB/MB/GB/TB 后缀表示磁盘大小,因此会根据已知值检查后缀以消除太小的磁盘,但也能处理 1 到 199 TB 之间的磁盘,并将其转换为 1024 - 203776 GB 以供比较。
可以将附加命令放置在底部的黑色代码中,以进一步自动化该过程。
答案2
您可以在批处理文件中使用它 - 例如 getpart 4 2 来获取磁盘 4 分区 2 的详细信息
@Echo Off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
for /f "tokens=2,3,4,5,6,7" %%B in ('^(echo sel disk %1^&echo list part^)^|diskpart^|FIND /I "Partition %2"') do set L_PART=%%B & set L_TYPE=%%C & set /A L_SIZE=%%D & set L_UNITS=%%E
echo L_PART=%L_PART% L_TYPE=%L_TYPE% L_SIZE=%L_SIZE% L_UNITS=%L_UNITS%
ENDLOCAL