Как узнать объем диска и свободное пространство на удаленном компьютере
у меня есть один-лайнер:
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 :
как я могу получить Freespace и Size на DeviceIDC:? Мне нужно извлечь только эти два значения без какой-либо другой информации. Я пробовал это с Select командлет, но без эффекта.
Edit:
Мне нужно извлечь только числовые значения и сохранить их в переменных.
13 ответов:
$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}
гораздо более простое решение:
Get-PSDrive C | Select-Object Used,Freeи для удаленных компьютеров (потребности
Powershell Remoting)Invoke-Command -ComputerName SRV2 {Get-PSDrive C} | Select-Object PSComputerName,Used,Free
некоторое время назад я создал расширенную функцию PowerShell (командлет script), которая позволяет запрашивать несколько компьютеров.
код для функции составляет немногим более 100 строк, так что вы можете найти его здесь: PowerShell версия команды df
Проверьте использование для примера. В следующем примере использования запрашивается набор удаленных компьютеров (ввод из конвейера 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вы все еще можете использовать эту команду на удаленном сервере, выполнив команду Enter-PSSession-Computername ServerName, а затем запустите Get-PSDrive, который будет извлекать данные, как если бы вы запускали его с сервера.
другой способ-это приведение строки к объекту WMI:
$size = ([wmi]"\remotecomputer\root\cimv2:Win32_logicalDisk.DeviceID='c:'").Size $free = ([wmi]"\remotecomputer\root\cimv2:Win32_logicalDisk.DeviceID='c:'").FreeSpaceтакже вы можете разделить результаты на 1 ГБ или 1 Мб, если вы хотите разные единицы измерения:
$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
есть две проблемы с которыми я столкнулся с другими предложениями
1) сопоставления дисков не поддерживаются при запуске powershell в планировщике задач
2) вы можете узнать Доступ запрещен ошибки Ошибки при попытке использовать "get-WmiObject" на удаленных компьютерах (в зависимости от настройки инфраструктуры, конечно)
альтернативой, которая не страдает от этих проблем, является использование GetDiskFreeSpaceEx С UNC-путем:
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 } }
:
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,562wmic 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 B80A0F40wmic 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
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>
Я знаю инструменты psExec, которые вы можете скачать с здесь
появляется psinfo.exe из пакета инструменты. Основное использование в powershell/cmd выполняется следующим образом.
вы могли бы иметь много вариантов с нимиспользование: 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.фильтр Psinfo будут отображаться только данные для поля, удовлетворяющие заданному фильтру. например, "psinfo service" содержит только поле пакета обновления.
Я удаленно в компьютер с помощью Enter-PSsession pcName затем я набираю Get-PSDrive
Что будет список всех дисков и пространства и остальные. Если вам нужно увидеть всю информацию, сформированную, передайте ее в FL следующим образом:Get-PSdrive | FL*
Я создал эту простую функцию, чтобы помочь мне. Это делает мои звонки намного проще читать, что имея встроенный 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
в случае, если вы хотите проверить несколько букв дисков и/или фильтр между локальными и сетевыми дисками, вы можете использовать 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, который проверяет все диски и отправляет предупреждение по электронной почте, когда они идут ниже пользовательской квоты. Вы можете получить его от здесь.


Comments