Disk kapasitesi ve uzak bilgisayarın boş alanı nasıl elde edilir


118

Bu tek satırım var:

get-WmiObject win32_logicaldisk -Computername remotecomputer

ve çıktı şudur:

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   :

Nasıl alırım Freespaceve Sizebir DeviceID C:? Başka hiçbir bilgi olmadan sadece bu iki değeri çıkarmam gerekiyor. SelectCmdlet ile denedim , ancak hiçbir etkisi olmadı.

Düzenleme: Yalnızca sayısal değerleri çıkarmam ve bunları değişkenlerde saklamam gerekiyor.

Yanıtlar:


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

$disk.Size
$disk.FreeSpace

Yalnızca değerleri çıkarmak ve bir değişkene atamak için:

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

18
$ disk.Size / 1GB eklemek de sonucu daha okunaklı hale getirir.
ricky89

8
Ekranı yalnızca tam sayıları gösterecek şekilde yuvarlamak istiyorsanız, şunu kullanın[Math]::Round($Disk.Freespace / 1GB)
user4317867

powershell'de neden 1mbbir değer döndürüyor 1048576ve değil 1000000????
yaşlı çocuk

@oldboy, çünkü 2: 2 ^ 20 ve 10 ^ 6'nın güçlerini kullanıyor. Aslında yazılmalıdır 1MiB(uygun büyük harflerle) ancak genellikle küçük harfle, "i" olmadan gösterilir. Bkz Mebibyte .
Matthieu

129

Çok daha basit çözüm:

Get-PSDrive C | Select-Object Used,Free

ve uzak bilgisayarlar için (ihtiyaçlar Powershell Remoting)

Invoke-Command -ComputerName SRV2 {Get-PSDrive C} | Select-Object PSComputerName,Used,Free

PSTools'u yükleyin ve yapınpsexec -u administrator \\[computer name or IP] powershell "get-psdrive C"
Bölüm Fikirleri

@JacobEvans ansible?
Kiquenet

Kimlik doğrulaması yapmanız gerekiyorsa, bu, uzak makinede "Kerberos kimlik doğrulama mekanizması" nın etkinleştirilmesini gerektirir.
Eddie Kumar

46

Tek bir komut basit, tatlı ve temiz ama bu yalnızca yerel diskler için çalışıyor

Get-PSDrive

görüntü açıklamasını buraya girin

Bu komutu, bir Enter-PSSession -Computername ServerName yaparak uzak bir sunucuda kullanmaya devam edebilirsiniz ve ardından Get-PSDrive'ı çalıştırırsanız, verileri sunucudan çalıştırmışsınız gibi çeker.


19

Bir süre önce birden fazla bilgisayarı sorgulamanıza izin veren bir PowerShell gelişmiş işlevi (komut dosyası cmdlet'i) oluşturdum.

İşlevin kodu 100 satırdan biraz daha uzun olduğundan burada bulabilirsiniz: df komutunun PowerShell sürümü

Örnekler için Kullanım bölümüne bakın. Aşağıdaki kullanım örneği, bir dizi uzak bilgisayarı sorgular (PowerShell ardışık düzeninden giriş) ve çıktıyı, insan tarafından okunabilir biçimde sayısal değerlerle bir tablo biçiminde görüntüler:

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

Bu işlevi kullanmak istiyorum, ancak blogspot alanı benim için engellendi. Lütfen işlevi buraya ekler misiniz?
Kevin Panko

1
web arşivindeki aynı bağlantı: web.archive.org/web/20150614115736/http://…
Thomas

Get-DiskFree, PowerShell 2.0'da görünmüyor
Geoff Dawdy

11

Diğer önerilerde karşılaştığım iki sorun var

    1) Powershell'i görev zamanlayıcı altında çalıştırırsanız sürücü eşlemeleri desteklenmez
    2) Sen alabilirsiniz erişim engellendi uzak bilgisayarlarda kullanılan "get-WmiObject" çalışırken hatalar hataları () tabii ki, senin altyapı kurulum bağlı olarak

Bu sorunlardan etkilenmeyen alternatif, GetDiskFreeSpaceEx'i bir UNC yolu ile kullanmaktır :

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
    } 
}

Teşekkürler, güzel bir çözüm ama biz tüm kullanıcı için UNCpath almak için benzer bir işleve sahiptir
user149621

TaskScheduler tarafından kullanılmadığında eşlenen sürücüler için PowerShell yöntemi mi?
Bill Greer

10

Başka bir yol da bir dizeyi bir WMI nesnesine çevirmektir:

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

Ayrıca, farklı birimler istiyorsanız sonuçları 1GB veya 1MB'ye bölebilirsiniz:

$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

Çıktı: Remotecomputer C: has 252.7 GB free of 298.0 GB Total



@BillGreer Bilmiyorum ama genellikle WMI aramalarını PS'den daha yavaş buldum. Kendiniz Measure-Command ile test edebilirsiniz ancak birkaç kez çalıştırdığınızdan ve sonuçların ortalamasını aldığınızdan emin olun.
duct_tape_coder

7

Komut satırı:

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

Çıktı:

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

Komut satırı:

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

dışarı:

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

Komut satırı:

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

dışarı:

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

2
Bu gülünç.
Alexander Trauzzi

neden @AlexanderTrauzzi?
Kiquenet

1
wmic logicaldisk get sizeayrılmış alanı hesaba katmaz tho ... powershell'de get-volumepratik toplam boyutu (yani eksi ayrılmış alan) döndürür, ancak sonra denediğimde get-volume | format-list sizetoplam boyut artı ayrılmış alanı söyler ... toplam boyut eksi ayrılmış alanı nasıl elde ederim powershell ile her sürücü için ???
ihtiyar çocuk

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

3
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> 

1
Nathan, düzenlemeni geri aldım. Bu, sonuçları için bir cevap seçenler için değerli olan çıktıyı gösterir. Kopyalayıp yapıştırmak için tek satırdır.
quux

2

Buradan indirebileceğiniz psExec araçlarını biliyorum

Araçlar paketinden bir psinfo.exe gelir. Temel kullanım powershell / cmd'de aşağıdaki şekildedir.

görüntü açıklamasını buraya girin

Ancak onunla birçok seçeneğiniz olabilir

Kullanım: psinfo [[\ bilgisayar [, bilgisayar [, ..] | @file [-u kullanıcı [-p psswd]]] [-h] [-s] [-d] [-c [-t sınırlayıcı]] [filtre]

\ computer Komutu uzak bilgisayarda veya belirtilen bilgisayarlarda gerçekleştirin. Bilgisayar adını atlarsanız, komut yerel sistemde çalışır ve bir joker karakter (\ *) belirtirseniz, komut geçerli etki alanındaki tüm bilgisayarlarda çalışır.

@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.

filtre Psinfo yalnızca filtreyle eşleşen alan için verileri gösterecektir. örneğin, "psinfo hizmeti" yalnızca hizmet paketi alanını listeler.


0

Enter-PSsession pcName kullanarak bilgisayara uzaktan giriyorum ve ardından Get-PSDrive yazıyorum

Bu, kullanılan ve kalan tüm sürücüleri ve alanı listeler. Biçimlendirilmiş tüm bilgileri görmeniz gerekiyorsa, bunu şu şekilde FL'ye aktarın : Get-PSdrive | FL *


0

Bana yardımcı olması için bu basit işlevi yarattım. Bu, aramalarımı bir Get-WmiObject , Where-Object ifadeleri vb. Satır içi olarak okumayı çok daha kolay hale getiriyor .

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

1
OP "Uzak Bilgisayar" idi. Bu benim için takılı sürücüde işe yaramadı, ama muhtemelen benim tarafımdaydı ...
Yumi Koizumi

0

Yerel ve ağ sürücüleri arasında birden çok sürücü harfini kontrol etmek ve / veya filtrelemek isterseniz, Win32_LogicalDisk WMI sınıfından yararlanmak için PowerShell'i kullanabilirsiniz . İşte hızlı bir örnek:

$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");
  }
}

Yukarıdaki tekniği, tüm sürücüleri kontrol eden ve kullanıcı tanımlı bir kotanın altına düştüğünde bir e-posta uyarısı gönderen bir Powershell betiği oluşturmak için kullandım. Blogumdaki bu yazıdan edinebilirsiniz .


0

PowerShell Eğlencesi

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

0

Get-Volume komutunu buldum , geri dönüyor SizeRemaining, bu yüzden (Get-Volume -DriveLetter C).SizeRemaining / (1e+9)C diskinde kalan Gb'yi görmek için kullanılabilir gibi bir şey Get-WmiObject Win32_LogicalDisk. Daha hızlı çalışıyor gibi görünüyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.