本帖最后由 gyp2000 于 2023-4-8 11:31 编辑
也可以正则直接提取磁盘容量,然后根据容量大小删除盘符。
不过win7 win8.1 win10 下的 DISKPART.EXE 返回信息可能不完全一样,一个正则无法适配所有系统。
如果用其他办法判断分区是否需要隐藏,那么只需要用 _WinAPI_GetDriveNumber 获取盘序号和分区号,
就可以调用 DISKPART.EXE 删除盘符了。
#include <AutoItConstants.au3>
#include <WinAPIFiles.au3>
Example()
Func Example()
Local $iPID, $aData, $PartList
$iPID = Run(@SystemDir & "\DISKPART.EXE", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($iPID, "LIST VOLUME" & @CRLF & "Exit" & @CRLF)
While ProcessExists($iPID)
Sleep(10)
WEnd
$aData = BinaryToString(StdoutRead($iPID, False, True))
ConsoleWrite($aData)
$PartList = StringRegExp($aData, "(?m)^.*?卷\h{5}\d\h{5}([A-Za-z]).*?磁盘分区\h*?(\d+)*\h*?MB", 3)
If @error Then Return
For $s = 0 To UBound($PartList) - 1 Step 2
If int($PartList[$s + 1]) > 100 Then ;如果分区容量大于 100MB 并且有盘符,则删除盘符
$aData = _WinAPI_GetDriveNumber($PartList[$s] & ":")
DISKPART($aData[1], $aData[2])
ConsoleWrite("驱动器:" & $PartList[$s] & " 盘序号:" & $aData[1] & " 分区号:" & $aData[2] & @CRLF)
EndIf
Next
EndFunc ;==>Example
Func DISKPART($DeviceNumber, $PartitionNumber)
Local $iPID
$iPID = Run(@SystemDir & "\DISKPART.EXE", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($iPID, "SELECT DISK " & $DeviceNumber & @CRLF & _
"SELECT PARTITION " & $PartitionNumber & @CRLF & _
"REMOVE ALL NOERR" & @CRLF & _
"Exit" & @CRLF)
While ProcessExists($iPID)
Sleep(10)
WEnd
$aData = BinaryToString(StdoutRead($iPID, False, True))
ConsoleWrite($aData)
EndFunc ;==>DISKPART
|