检查所有驱动器(盘符和可用大小)并比较高数字可用大小



我在比较大量 PC 磁盘时遇到问题。

脚本:

for /f "tokens=* delims== skip=1" %%x in ('"wmic.exe logicaldisk where DriveType=3 get DeviceID,FreeSpace,Size"') do (
for /f "tokens=1-3" %%a in ("%%x") do (
set "DiskID=%%a" & set "DiskFree=%%b"
if !DiskFree! gtr !DiskFreeFinal! Set "DiskIDFinal=!DiskID!" && set "DiskFreeFinal=!DiskFree!"
)
)
echo Biggest free space is on drive: %DiskIDFinal% (%DiskFreeFinal%)

输出是坏大小比较不真实。

您的批处理经过重新设计,可以对大数字进行基于字符串的比较(高达 88817 PB(

:: Q:Test2018627SO_51057439.cmd
@Echo off&SetLocal EnableDelayedExpansion
Set "Space=                    "
Set "DiskFreeFinal=%Space%"
for /f "tokens=* delims== skip=1" %%x in (
'"wmic.exe logicaldisk where DriveType=3 get DeviceID,FreeSpace,Size"'
) do for /f "tokens=1-3" %%a in ("%%x") do (
set "DiskFree=%Space%%%b"
Rem Echo %%a !DiskFree:~-20!
if "!DiskFree:~-20!" gtr "!DiskFreeFinal:~-20!" (
set "DiskIDFinal=%%a"
set "DiskFreeFinal=!DiskFree!"
)
)
echo Biggest free space is on drive: %DiskIDFinal% (%DiskFreeFinal: =%)

示例输出(包括 REM 输出线(:

> .SO_51057439.cmd
A:           1049407488 1049407488
C:         113724567552 113724567552
D:        1090293293056 1090293293056
G:         778550509568 778550509568
H:             68505600 68505600
Biggest free space is on drive: D: (1090293293056)

随附的PowerShell答案(尽管缺少适当的标签(,用于信息和比较目的。

$FixedDisks = Get-WMIObject -Query "Select DeviceID,FreeSpace From Win32_LogicalDisk Where DriveType='3'"
$MostFreeSpace = 0
$MostName = "Null"
ForEach ( $Disk In $FixedDisks ) {
If ( $Disk.FreeSpace -GT $MostFreeSpace ) {
$MostFreeSpace = $Disk.FreeSpace
$MostName = $Disk.DeviceID
}
}
Write-Host "Biggest free space is on drive: $MostName ($MostFreeSpace)"

您可以将数字左零填充以与相同的宽度进行比较,然后进行字符串比较:

@echo off
setlocal EnableDelayedExpansion
set "DiskIDFinal=" & set "DiskFreeFinal=000000000000000000000000"
for /F "skip=1 delims=" %%x in ('"wmic.exe logicaldisk where DriveType=3 get DeviceID,FreeSpace,Size"') do (
for /F "tokens=1-3" %%a in ("%%x") do (
rem // Pad number with 24 zeros to the left, then compare the right-most 24 digits:
set "DiskID=%%a" & set "DiskFree=000000000000000000000000%%b"
if "!DiskFree:~-24!" gtr "!DiskFreeFinal:~-24!" (
set "DiskIDFinal=!DiskID!" & set "DiskFreeFinal=!DiskFree:~-24!"
)
)
)
rem // Remove leading zeros from final number:
for /F "tokens=* delims=0" %%z in ("!DiskFreeFinal!") do set "DiskFreeFinal=%%z"
if not defined DiskFreeFinal set "DiskFreeFinal=0"
echo Biggest free space is on drive: %DiskIDFinal% (%DiskFreeFinal%)
endlocal

或者,您可以将数字分成两部分并单独比较:

@echo off
setlocal EnableDelayedExpansion
set "DiskIDFinal="
set /A "DiskFreeFinalHi=0, DiskFreeFinalLo=0"
for /F "skip=1 delims=" %%x in ('"wmic.exe logicaldisk where DriveType=3 get DeviceID,FreeSpace,Size"') do (
for /F "tokens=1-3" %%a in ("%%x") do (
set "DiskID=%%a" & set "DiskFreeLo=%%b"
rem // Split number into two parts for the right part to have 9 digits:
set "DiskFreeHi=!DiskFreeLo:~,-9!" & set "DiskFreeLo=!DiskFreeLo:~-9!"
for /F "tokens=* delims=0" %%z in ("!DiskFreeLo!") do set "DiskFreeLo=%%z"
set /A "DiskFreeHi+=0, DiskFreeLo+=0"
if !DiskFreeHi! gtr !DiskFreeFinalHi! (
set "DiskIDFinal=!DiskID!"
set /A "DiskFreeFinalHi=DiskFreeHi, DiskFreeFinalLo=DiskFreeLo"
) else if !DiskFreeHi! equ !DiskFreeFinalHi! (
if !DiskFreeLo! gtr !DiskFreeFinalLo! (
set "DiskIDFinal=!DiskID!"
set /A "DiskFreeFinalHi=DiskFreeHi, DiskFreeFinalLo=DiskFreeLo"
)
)
)
)
rem // Recombine the two parts of the number:
set "DiskFreeFinalLo=000000000%DiskFreeFinalLo%"
for /F "tokens=* delims=0" %%z in ("%DiskFreeFinalHi%%DiskFreeFinalLo:~-9%") do set "DiskFreeFinal=%%z"
if not defined DiskFreeFinal set "DiskFreeFinal=0"
echo Biggest free space is on drive: %DiskIDFinal% (%DiskFreeFinal%)
endlocal

最新更新