如何获得远程计算机的磁盘容量和空闲空间

我有一句俏皮话:

get-WmiObject win32_logicaldisk -Computername remotecomputer

输出是这样的:

DeviceID     : A:
DriveType    : 2
ProviderName :
FreeSpace    :
Size         :
VolumeName   :


DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 20116508672
Size         : 42842714112
VolumeName   :


DeviceID     : D:
DriveType    : 5
ProviderName :
FreeSpace    :
Size         :
VolumeName   :

如何得到 DeviceID C:FreespaceSize?我只需要提取这两个值,没有其他信息。我用 Selectcmdlet 试过,但没有效果。

编辑: 我只需要提取数值并将它们存储在变量中。

766561 次浏览
$disk = Get-WmiObject Win32_LogicalDisk -ComputerName remotecomputer -Filter "DeviceID='C:'" |
Select-Object Size,FreeSpace


$disk.Size
$disk.FreeSpace

仅提取值并将它们分配给变量:

$disk = Get-WmiObject Win32_LogicalDisk -ComputerName remotecomputer -Filter "DeviceID='C:'" |
Foreach-Object {$_.Size,$_.FreeSpace}

另一种方法是将字符串强制转换为 WMI 对象:

$size = ([wmi]"\\remotecomputer\root\cimv2:Win32_logicalDisk.DeviceID='c:'").Size
$free = ([wmi]"\\remotecomputer\root\cimv2:Win32_logicalDisk.DeviceID='c:'").FreeSpace

如果你想要不同的单位,你也可以将结果除以1GB 或1MB:

$disk = ([wmi]"\\remotecomputer\root\cimv2:Win32_logicalDisk.DeviceID='c:'")
"Remotecomputer C: has {0:#.0} GB free of {1:#.0} GB Total" -f ($disk.FreeSpace/1GB),($disk.Size/1GB) | write-output

输出为: Remotecomputer C: has 252.7 GB free of 298.0 GB Total

命令行:

powershell gwmi Win32_LogicalDisk -ComputerName remotecomputer -Filter "DriveType=3" ^|
select Name, FileSystem,FreeSpace,BlockSize,Size ^| % {$_.BlockSize=
(($_.FreeSpace)/($_.Size))*100;$_.FreeSpace=($_.FreeSpace/1GB);$_.Size=($_.Size/1GB);$_}
^| Format-Table Name, @{n='FS';e={$_.FileSystem}},@{n='Free, Gb';e={'{0:N2}'-f
$_.FreeSpace}}, @{n='Free,%';e={'{0:N2}'-f $_.BlockSize}},@{n='Capacity ,Gb';e={'{0:N3}'
-f $_.Size}} -AutoSize

产出:

Name FS   Free, Gb Free,% Capacity ,Gb


---- --   -------- ------ ------------


C:   NTFS 16,64    3,57   465,752


D:   NTFS 43,63    9,37   465,759


I:   NTFS 437,59   94,02  465,418


N:   NTFS 5,59     0,40   1 397,263


O:   NTFS 8,55     0,96   886,453


P:   NTFS 5,72     0,59   976,562

命令行:

wmic logicaldisk where DriveType="3" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace

出去:

Caption  FileSystem  FreeSpace     Size           VolumeName  VolumeSerialNumber


C:       NTFS        17864343552   500096991232   S01         EC641C36


D:       NTFS        46842589184   500104687616   VM1         CAF2C258


I:       NTFS        469853536256  499738734592   V8          6267CDCC


N:       NTFS        5998840832    1500299264512  Vm-1500     003169D1


O:       NTFS        9182349312    951821143552   DT01        A8FC194C


P:       NTFS        6147043840    1048575144448  DT02        B80A0F40

命令行:

wmic logicaldisk where Caption="C:" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace

出去:

Caption  FileSystem  FreeSpace    Size          VolumeName  VolumeSerialNumber


C:       NTFS        17864327168  500096991232  S01         EC641C36


command-line:


dir C:\ /A:DS | find "free"


out:
4 Dir(s)  17 864 318 976 bytes free


dir C:\ /A:DS /-C | find "free"


out:
4 Dir(s)     17864318976 bytes free

不久前,我创建了一个 PowerShell 高级函数(脚本 cmdlet) ,它允许您查询多台计算机。

这个函数的代码只有100多行,所以您可以在这里找到它: Df 命令的 PowerShell 版本

查看 用法部分的例子。下面的用法示例查询一组远程计算机(来自 PowerShell 管道的输入) ,并以表格格式显示输出,其中的数值以人类可读的形式显示:

PS> $cred = Get-Credential -Credential 'example\administrator'
PS> 'db01','dc01','sp01' | Get-DiskFree -Credential $cred -Format | Format-Table -GroupBy Name -AutoSize


Name: DB01


Name Vol Size  Used  Avail Use% FS   Type
---- --- ----  ----  ----- ---- --   ----
DB01 C:  39.9G 15.6G 24.3G   39 NTFS Local Fixed Disk
DB01 D:  4.1G  4.1G  0B     100 CDFS CD-ROM Disc




Name: DC01


Name Vol Size  Used  Avail Use% FS   Type
---- --- ----  ----  ----- ---- --   ----
DC01 C:  39.9G 16.9G 23G     42 NTFS Local Fixed Disk
DC01 D:  3.3G  3.3G  0B     100 CDFS CD-ROM Disc
DC01 Z:  59.7G 16.3G 43.4G   27 NTFS Network Connection




Name: SP01


Name Vol Size   Used   Avail Use% FS   Type
---- --- ----   ----   ----- ---- --   ----
SP01 C:  39.9G  20G    19.9G   50 NTFS Local Fixed Disk
SP01 D:  722.8M 722.8M 0B     100 UDF  CD-ROM Disc

更简单的解决方案:

Get-PSDrive C | Select-Object Used,Free

和远程计算机(需要 Powershell Remoting)

Invoke-Command -ComputerName SRV2 {Get-PSDrive C} | Select-Object PSComputerName,Used,Free
PS> Get-CimInstance -ComputerName bobPC win32_logicaldisk | where caption -eq "C:" | foreach-object {write " $($_.caption) $('{0:N2}' -f ($_.Size/1gb)) GB total, $('{0:N2}' -f ($_.FreeSpace/1gb)) GB free "}
C: 117.99 GB total, 16.72 GB free


PS>

我使用 < strong > Enter-PSsession pcName 远程进入计算机 然后我输入 < strong > Get-PSDrive

这将列出所有驱动器和空间使用和剩余。如果您需要看到所有的信息格式化,管道它到 FL 像这样: Get-PSdrive | FL *

我在其他建议中遇到了两个问题

    1) 如果在任务调度程序下运行 powershell,则不支持驱动器映射
    2) 在远程计算机上使用“ get-WmiObject”时可能会出现 拒绝访问错误(当然,这取决于您的基础设施设置)

不会受到这些问题影响的另一种方法是使用带有 UNC 路径的 GetDiskFreeSpaceEx:

function getDiskSpaceInfoUNC($p_UNCpath, $p_unit = 1tb, $p_format = '{0:N1}')
{
# unit, one of --> 1kb, 1mb, 1gb, 1tb, 1pb
$l_typeDefinition = @'
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);
'@
$l_type = Add-Type -MemberDefinition $l_typeDefinition -Name Win32Utils -Namespace GetDiskFreeSpaceEx -PassThru


$freeBytesAvailable     = New-Object System.UInt64 # differs from totalNumberOfFreeBytes when per-user disk quotas are in place
$totalNumberOfBytes     = New-Object System.UInt64
$totalNumberOfFreeBytes = New-Object System.UInt64


$l_result = $l_type::GetDiskFreeSpaceEx($p_UNCpath,([ref]$freeBytesAvailable),([ref]$totalNumberOfBytes),([ref]$totalNumberOfFreeBytes))


$totalBytes     = if($l_result) { $totalNumberOfBytes    /$p_unit } else { '' }
$totalFreeBytes = if($l_result) { $totalNumberOfFreeBytes/$p_unit } else { '' }


New-Object PSObject -Property @{
Success   = $l_result
Path      = $p_UNCpath
Total     = $p_format -f $totalBytes
Free      = $p_format -f $totalFreeBytes
}
}

我创建了这个简单的函数来帮助我。这使得我的调用更容易阅读,比如内联 Get-WmiObject哪里-目标语句等。

function GetDiskSizeInfo($drive) {
$diskReport = Get-WmiObject Win32_logicaldisk
$drive = $diskReport | Where-Object { $_.DeviceID -eq $drive}


$result = @{
Size = $drive.Size
FreeSpace = $drive.Freespace
}
return $result
}


$diskspace = GetDiskSizeInfo "C:"
write-host $diskspace.FreeSpace " " $diskspace.Size

我知道 psExec 工具,你可以从 给你下载

工具包中有一个 psinfo.exe。

enter image description here

然而你可以有很多选择吗

用法: psinfo [[ computer [ ,computer [ ,. . ] |@file [-u user ] [-p psswd ]][-h ][-s ][-d ][-c [-t 分隔符]][过滤器]

在指定的远程计算机上执行命令。如果省略命令在本地系统上运行的计算机名,并指定通配符(*) ,则该命令在当前域中的所有计算机上运行。

@file   Run the command on each computer listed in the text file specified.
-u  Specifies optional user name for login to remote computer.
-p  Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password.
-h  Show list of installed hotfixes.
-s  Show list of installed applications.
-d  Show disk volume information.
-c  Print in CSV format.
-t  The default delimiter for the -c option is a comma, but can be overriden with the specified character.

Filter Psinfo 将只显示与筛选器匹配的字段的数据。例如“ psinfo service”只列出了 service pack 字段。

Get-PSDrive C | Select-Object @{ E={$_.Used/1GB}; L='Used' }, @{ E={$_.Free/1GB}; L='Free' }

如果您想在本地和网络驱动器之间检查多个驱动器字母和/或过滤器,可以使用 PowerShell 来利用 Win32 _ LogicalDisk WMI类。这里有一个简单的例子:

$localVolumes = Get-WMIObject win32_volume;


foreach ($vol in $localVolumes) {
if ($vol.DriveLetter -ne $null ) {
$d = $vol.DriveLetter[0];
if ($vol.DriveType -eq 3) {
Write-Host ("Drive " + $d + " is a Local Drive");
}
elseif ($vol.DriveType -eq 4) {
Write-Host ("Drive" + $d + " is a Network Drive");
}
else {
// ... and so on
}


$drive = Get-PSDrive $d;
Write-Host ("Used space on drive " + $d + ": " + $drive.Used + " bytes. `r`n");
Write-Host ("Free space on drive " + $d + ": " + $drive.Free + " bytes. `r`n");
}
}

我使用上述技术创建了一个 Powershell 脚本,该脚本检查所有驱动器,并在它们低于用户定义的配额时发送电子邮件警报。你可以在我的博客上看到 这篇文章

只有一个简单的 sweet 和 clean 命令,但这只适用于本地磁盘

Get-PSDrive

enter image description here

您仍然可以在远程服务器上使用这个命令,只要输入一个 Enter-PSSsession-Computername ServerName,然后运行 Get-PSDrive,它就会像从服务器上运行一样提取数据。

PowerShell Fun

Get-WmiObject win32_logicaldisk -Computername <ServerName> -Credential $(get-credential) | Select DeviceID,VolumeName,FreeSpace,Size | where {$_.DeviceID -eq "C:"}

刚刚找到了返回 SizeRemaining音量命令,所以像 (Get-Volume -DriveLetter C).SizeRemaining / (1e+9)这样的命令可以用来查看磁盘 C 的剩余 Gb 值。似乎比 Get-WmiObject Win32_LogicalDisk运行得更快。

关于 PowerShell:

"FreeSpace C:  " + [math]::Round((Get-Volume -DriveLetter C).SizeRemaining / 1Gb) + " GB"