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

Powershell 如何获得远程计算机的磁盘容量和可用空间,powershell,scripting,powershell-2.0,Powershell,Scripting,Powershell 2.0,我有一句话: get-WmiObject win32_logicaldisk -Computername remotecomputer 输出是这样的: DeviceID : A: DriveType : 2 ProviderName : FreeSpace : Size : VolumeName : DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 20116508672

我有一句话:

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:
Freespace
Size
?我只需要提取这两个值,没有其他信息。我已使用
Select
cmdlet进行了尝试,但没有效果

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

$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:252.7GB,总容量为298.0GB

命令行:

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
wmic logicaldisk where DriveType="3" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace
wmic logicaldisk where Caption="C:" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace
输出:

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
命令行:

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
wmic logicaldisk where DriveType="3" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace
wmic logicaldisk where Caption="C:" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace
输出:

命令行:

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
wmic logicaldisk where DriveType="3" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace
wmic logicaldisk where Caption="C:" get caption, VolumeName, VolumeSerialNumber, Size, FileSystem, FreeSpace
输出:


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

该函数的代码长度略超过100行,因此您可以在此处找到它:

查看用法部分了解示例。以下使用示例查询一组远程计算机(来自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远程处理)


我使用输入PSsession pcName将遥控器输入计算机 然后我键入获取PSDrive


这将列出所有已使用和剩余的驱动器和空间。如果您需要查看所有格式化的信息,请按如下方式将其传送到FL:获取PSdrive | FL*

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

1) 如果在任务计划程序下运行powershell,则不支持驱动器映射 2) 您可能获得访问被拒绝错误尝试在远程计算机上使用“获取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
    } 
}

我创建了这个简单的函数来帮助我。这使得我的调用比使用内联an、语句等更容易阅读

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。powershell/cmd中的基本用法如下所示

但是你可以有很多选择

用法:psinfo[\computer[,computer[,…]|@file[-u user [-p psswd]][-h][-s][-d][-c[-t分隔符]][filter]

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

@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 pack字段。

如果要检查多个驱动器号和/或本地驱动器和网络驱动器之间的筛选器,可以使用PowerShell来利用该类。下面是一个快速示例:

Get-PSDrive C | Select-Object @{ E={$_.Used/1GB}; L='Used' }, @{ E={$_.Free/1GB}; L='Free' }
$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 and clean命令,但这仅适用于本地磁盘

Get-PSDrive

您仍然可以在远程服务器上使用此命令,方法是执行Enter-PSSession-Computername-ServerName,然后运行Get-PSDrive。它将像从服务器上运行数据一样提取数据。

PowerShell Fun

Get-WmiObject win32_logicaldisk -Computername <ServerName> -Credential $(get-credential) | Select DeviceID,VolumeName,FreeSpace,Size | where {$_.DeviceID -eq "C:"}
Get-WmiObject win32\u logicaldisk-Computername-Credential$(Get-Credential)|选择DeviceID、VolumeName、FreeSpace、Size |其中{$\u.DeviceID-eq“C:”}
刚找到的命令,它返回
SizeMaining
,因此类似于
(获取卷-驱动器号C)。SizeMaining/(1e+9)
可以用于查看磁盘C的剩余Gb。似乎比PowerShell上的
获取WmiObject Win32_LogicalDisk
更快:

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

另请参阅和@BillGreer不立即知道,但我经常发现WMI调用比PS慢。您可以自己使用Measure命令进行测试,但请确保多次运行该命令并平均结果。Nathan,我回滚了您的编辑。这显示了给定的输出,这对为其结果选择答案的人很有价值。这是要复制的一行&粘贴。我想使用此功能,但blogspot域已被阻止。请在此处包含此功能好吗?web archive上的相同链接:Get DiskFree在PowerShell 2中似乎不可用。0@MarcelloMiorelli当然,但至少要解释一下代码的作用和工作原理。我已经看到太多的答案给出了link最终消失了,使得整个答案毫无用处。@Matthieu是的,你是对的,我也看到了,非常经常地,简单地添加$disk.Size/1GB也会使结果更可读。如果你想对显示进行四舍五入,只显示整数,请使用
[Math]::round($disk.Freespace/1GB)
在powershell中为什么
1mb
返回值
1048576
而不是
1000000
?@oldboy,因为它使用的是2:2^20和10^6的幂次。它确实应该写入
1mb
(大小写合适),但通常以小写显示,没有“i”。请参阅。@oldboy why mb,这一次已经过去很久了,关于内存,我们还有1000个。安装并执行
psexec-u administrator\\[computer name或IP]powershell“get psdrive C”
如果您需要验证,这将需要“Kerberos验证机制”在远程计算机中启用。如果您希望此选项更具可读性,请尝试:“Get-PSDrive | Select Object@{Expression={$\ Free/1TB}”,谢谢,这是一个不错的解决方案,但我们是否有类似的函数来获取所有用户的UNCpath。当TaskScheduler未使用PowerShell方法时,是否为映射的驱动器执行PowerShell方法?这是ridic