Cara mendapatkan kapasitas disk dan ruang kosong komputer jarak jauh

118

Saya memiliki satu baris ini:

get-WmiObject win32_logicaldisk -Computername remotecomputer

dan hasilnya adalah ini:

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   :

Bagaimana cara mendapatkan Freespacedan Sizedari DeviceID C:? Saya hanya perlu mengekstrak dua nilai ini tanpa informasi lain. Saya telah mencobanya dengan Selectcmdlet, tetapi tidak berhasil.

Edit: Saya hanya perlu mengekstrak nilai numerik dan menyimpannya dalam variabel.

culter
sumber

Jawaban:

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

$disk.Size
$disk.FreeSpace

Untuk mengekstrak nilai saja dan menetapkannya ke variabel:

$disk = Get-WmiObject Win32_LogicalDisk -ComputerName remotecomputer -Filter "DeviceID='C:'" |
Foreach-Object {$_.Size,$_.FreeSpace}
Shay Levy
sumber
18
cukup menambahkan $ disk.Size / 1GB membuat hasilnya lebih mudah dibaca juga.
ricky89
8
Jika Anda ingin membulatkan tampilan untuk hanya menampilkan seluruh nomor, penggunaan[Math]::Round($Disk.Freespace / 1GB)
user4317867
di PowerShell mengapa 1mbmengembalikan nilai 1048576dan bukan 1000000????
oldboy
@oldboy karena menggunakan pangkat 2: 2 ^ 20 vs. 10 ^ 6. Ini memang harus ditulis 1MiB(dengan huruf yang benar) tetapi biasanya ditampilkan dalam huruf kecil, tanpa "i". Lihat Mebibyte .
Matthieu
129

Solusi yang jauh lebih sederhana:

Get-PSDrive C | Select-Object Used,Free

dan untuk komputer jarak jauh (kebutuhan Powershell Remoting)

Invoke-Command -ComputerName SRV2 {Get-PSDrive C} | Select-Object PSComputerName,Used,Free
Pointer Null dll.
sumber
Instal PSTools dan lakukanpsexec -u administrator \\[computer name or IP] powershell "get-psdrive C"
Ch.Idea
@JacobEvans ansible?
Kiquenet
Jika Anda perlu mengotentikasi, ini akan membutuhkan "mekanisme otentikasi Kerberos" yang diaktifkan di mesin jarak jauh.
Eddie Kumar
46

Hanya satu perintah sederhana manis dan bersih tetapi ini hanya berfungsi untuk disk lokal

Get-PSDrive

masukkan deskripsi gambar di sini

Anda masih bisa menggunakan perintah ini di server jarak jauh dengan melakukan Enter-PSSession -Computername ServerName dan kemudian menjalankan Get-PSDrive itu akan menarik data seolah-olah Anda menjalankannya dari server.

grepit
sumber
19

Saya membuat fungsi lanjutan PowerShell (script cmdlet) beberapa waktu yang lalu yang memungkinkan Anda untuk menanyakan beberapa komputer.

Kode untuk fungsinya sedikit lebih dari 100 baris, jadi Anda dapat menemukannya di sini: Versi PowerShell dari perintah df

Lihat bagian Penggunaan untuk mengetahui contohnya. Contoh penggunaan berikut mengkueri sekumpulan komputer jarak jauh (input dari pipa PowerShell) dan menampilkan output dalam format tabel dengan nilai numerik dalam bentuk yang dapat dibaca manusia:

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
mweisel.dll
sumber
Saya ingin menggunakan fungsi ini, tetapi domain blogspot diblokir untuk saya. Bisakah Anda memasukkan fungsi di sini?
Kevin Panko
1
tautan yang sama di arsip web: web.archive.org/web/20150614115736/http://…
Thomas
Get-DiskFree tampaknya tidak tersedia di PowerShell 2.0
Geoff Dawdy
11

Ada dua masalah yang saya temui dengan saran lainnya

    1) Pemetaan drive tidak didukung jika Anda menjalankan PowerShell di bawah penjadwal tugas
    2) Anda mungkin mendapatkan kesalahan Akses ditolak, kesalahan mencoba menggunakan "get-WmiObject" di komputer jarak jauh (tentu saja tergantung pada pengaturan infrastruktur Anda)

Alternatif yang tidak mengalami masalah ini adalah menggunakan GetDiskFreeSpaceEx dengan jalur 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
    } 
}
Warren Stevens
sumber
Terima kasih, solusi yang bagus tapi kita harus fungsi yang sama untuk mendapatkan UNCpath untuk semua pengguna
user149621
Apakah metode PowerShell untuk drive yang dipetakan saat tidak digunakan oleh TaskScheduler?
Bill Greer
10

Cara lain adalah mentransmisikan string ke objek WMI:

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

Anda juga dapat membagi hasil dengan 1GB atau 1MB jika Anda menginginkan unit yang berbeda:

$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

Outputnya adalah: Remotecomputer C: has 252.7 GB free of 298.0 GB Total

Greg Bray
sumber
@BillGreer Tidak tahu begitu saja, tetapi saya sering menemukan panggilan WMI lebih lambat dari PS. Anda dapat menguji sendiri dengan Measure-Command tetapi pastikan untuk menjalankannya berkali-kali dan rata-rata hasilnya.
duct_tape_coder
7

Garis komando:

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

Keluaran:

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

garis komando:

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

di luar:

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

garis komando:

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

di luar:

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
STTR
sumber
2
Ini konyol.
Alexander Trauzzi
kenapa @AlexanderTrauzzi?
Kiquenet
1
wmic logicaldisk get sizetidak memperhitungkan ruang yang dicadangkan tho ... di PowerShell get-volumemengembalikan ukuran total praktis (yaitu dikurangi ruang yang dicadangkan), tetapi kemudian ketika saya mencobanya get-volume | format-list sizedikatakan ukuran total ditambah ruang yang dicadangkan ... bagaimana cara saya mendapatkan ukuran total dikurangi ruang yang dicadangkan untuk setiap drive dengan PowerShell ???
oldboy
6
Get-PSDrive C | Select-Object @{ E={$_.Used/1GB}; L='Used' }, @{ E={$_.Free/1GB}; L='Free' }
leorzz
sumber
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> 
quux
sumber
1
Nathan, saya mengembalikan suntingan Anda. Ini menunjukkan keluaran yang diberikan, yang berharga bagi mereka yang memilih jawaban untuk hasilnya. Itu satu baris untuk disalin & ditempel.
Quux
2

Saya tahu alat psExec yang dapat Anda unduh dari sini

Ada psinfo.exe dari paket alat. Penggunaan dasarnya adalah sebagai berikut di PowerShell / cmd.

masukkan deskripsi gambar di sini

Namun Anda bisa memiliki banyak opsi dengannya

Penggunaan: psinfo [[\ computer [, computer [, ..] | @file [-u pengguna [-p psswd]]] [-h] [-s] [-d] [-c [-t pembatas]] [filter]

\ computer Lakukan perintah pada komputer remote atau komputer yang ditentukan. Jika Anda menghilangkan nama komputer, perintah akan dijalankan di sistem lokal, dan jika Anda menentukan wildcard (\ *), perintah akan dijalankan di semua komputer di domain saat ini.

@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 hanya akan menampilkan data untuk bidang yang cocok dengan filter. misalnya "layanan psinfo" hanya mencantumkan bidang paket layanan.

Himanshu Chauhan
sumber
0

Saya melakukan remote ke komputer menggunakan Enter-PSsession pcName lalu saya ketik Get-PSDrive

Itu akan mencantumkan semua drive dan ruang yang digunakan dan yang tersisa. Jika Anda perlu melihat semua info yang telah diformat, kirimkan ke FL seperti ini: Get-PSdrive | FL *

Michael Dark
sumber
0

Saya membuat fungsi sederhana ini untuk membantu saya. Ini membuat panggilan saya jauh lebih mudah untuk dibaca bahwa memiliki pernyataan Get-WmiObject , Where-Object , dll.

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
Kaj Bonfils
sumber
1
OP adalah "Komputer Jarak Jauh". Ini tidak berhasil untuk saya di drive yang terpasang, tapi itu mungkin di pihak saya ...
Yumi Koizumi
0

Jika Anda ingin memeriksa beberapa huruf kandar dan / atau filter antara kandar lokal dan jaringan, Anda dapat menggunakan PowerShell untuk memanfaatkan kelas WMI Win32_LogicalDisk . Berikut contoh singkatnya:

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

Saya menggunakan teknik di atas untuk membuat skrip Powershell yang memeriksa semua drive dan mengirim peringatan email setiap kali mereka berada di bawah kuota yang ditentukan pengguna. Anda bisa mendapatkannya dari postingan ini di blog saya.

Darkseal
sumber
0

PowerShell Fun

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

Baru saja menemukan perintah Get-Volume , yang kembali SizeRemaining, jadi sesuatu seperti (Get-Volume -DriveLetter C).SizeRemaining / (1e+9)dapat digunakan untuk melihat Gb tetap untuk disk C. Sepertinya bekerja lebih cepat dari Get-WmiObject Win32_LogicalDisk.

Ilya Finkelsheyn
sumber