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