Cách lấy dung lượng đĩa và dung lượng trống của máy tính từ xa


117

Tôi có một lớp lót này:

get-WmiObject win32_logicaldisk -Computername remotecomputer

và đầu ra là:

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   :

Làm thế nào để tôi nhận được FreespaceSizecủa DeviceID C:? Tôi chỉ cần trích xuất hai giá trị này mà không có thông tin nào khác. Tôi đã thử nó với Selectcmdlet, nhưng không có tác dụng.

Chỉnh sửa: Tôi chỉ cần trích xuất các giá trị số và lưu trữ chúng trong các biến.

Câu trả lời:


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

$disk.Size
$disk.FreeSpace

Để chỉ trích xuất các giá trị và gán chúng cho một biến:

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

18
chỉ cần thêm $ disk.Size / 1GB cũng làm cho kết quả dễ đọc hơn.
ricky89

8
Nếu bạn muốn làm tròn màn hình chỉ hiển thị số nguyên, sử dụng[Math]::Round($Disk.Freespace / 1GB)
user4317867

trong powershell tại sao 1mbtrả về giá trị là 1048576và không 1000000????
oldboy

@oldboy vì nó sử dụng quyền hạn 2: 2 ^ 20 so với 10 ^ 6. Nó thực sự nên được viết 1MiB(với trường hợp thích hợp) nhưng thường được hiển thị bằng chữ thường, không có chữ "i". Xem Mebibyte .
Matthieu ngày

128

Giải pháp đơn giản hơn nhiều:

Get-PSDrive C | Select-Object Used,Free

và cho máy tính từ xa (nhu cầu Powershell Remoting)

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

Cài đặt pstools và làmpsexec -u administrator \\[computer name or IP] powershell "get-psdrive C"
Ch.Idea

@JacobEvans có thể trả được không?
Kiquenet

Nếu bạn cần xác thực, điều này sẽ yêu cầu bật "cơ chế xác thực Kerberos" trong máy từ xa.
Eddie Kumar

45

Chỉ một lệnh đơn giản và sạch sẽ nhưng điều này chỉ hoạt động đối với các đĩa cục bộ

Get-PSDrive

nhập mô tả hình ảnh ở đây

Bạn vẫn có thể sử dụng lệnh này trên một máy chủ từ xa bằng cách thực hiện Enter-PSSession -Computername ServerName và sau đó chạy Get-PSDrive, nó sẽ kéo dữ liệu như thể bạn chạy nó từ máy chủ.


19

Tôi đã tạo một hàm nâng cao PowerShell (lệnh ghép ngắn tập lệnh) cho phép bạn truy vấn nhiều máy tính.

Mã cho hàm dài hơn 100 dòng một chút, vì vậy bạn có thể tìm thấy mã này tại đây: Phiên bản PowerShell của lệnh df

Kiểm tra phần Sử dụng để biết các ví dụ. Ví dụ sử dụng sau đây truy vấn một tập hợp các máy tính từ xa (đầu vào từ đường ống PowerShell) và hiển thị đầu ra ở định dạng bảng với các giá trị số ở dạng con người có thể đọc được:

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

Tôi muốn sử dụng chức năng này, nhưng miền blogspot bị chặn đối với tôi. Bạn có thể vui lòng bao gồm chức năng ở đây?
Kevin Panko

1
cùng một liên kết trên kho lưu trữ web: web.archive.org/web/20150614115736/http://…
Thomas

Get-DiskFree dường như không khả dụng trong PowerShell 2.0
Geoff Dawdy

11

Có hai vấn đề tôi gặp phải với các đề xuất khác

    1) Ánh xạ ổ đĩa không được hỗ trợ nếu bạn chạy quyền hạn trong bộ lập lịch tác vụ
    2) Bạn có thể nhận được Lỗi truy cập bị từ chối khi cố gắng sử dụng "get-WmiObject" trên máy tính từ xa (tất nhiên tùy thuộc vào thiết lập cơ sở hạ tầng của bạn)

Giải pháp thay thế không bị những vấn đề này là sử dụng GetDiskFreeSpaceEx với đường dẫn 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
    } 
}

Cảm ơn, giải pháp tốt đẹp, nhưng chúng ta có chức năng tương tự để có được UNCpath cho tất cả người dùng
user149621

Phương pháp PowerShell cho các ổ đĩa được ánh xạ khi không được TaskScheduler sử dụng?
Bill Greer

10

Một cách khác là truyền một chuỗi tới một đối tượng WMI:

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

Ngoài ra, bạn có thể chia kết quả cho 1GB hoặc 1MB nếu bạn muốn các đơn vị khác nhau:

$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

Đầu ra là: Remotecomputer C: has 252.7 GB free of 298.0 GB Total



@BillGreer Không biết nhưng tôi thường thấy các cuộc gọi WMI chậm hơn PS. Bạn có thể tự kiểm tra bằng Measure-Command nhưng hãy đảm bảo chạy nó nhiều lần và tính trung bình kết quả.
duct_tape_coder

7

Dòng lệnh:

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

Đầu ra:

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

dòng lệnh:

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

ngoài:

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

dòng lệnh:

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

ngoài:

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
Chuyện này thật vớ vẩn.
Alexander Trauzzi

tại sao lại là @AlexanderTrauzzi?
Kiquenet

1
wmic logicaldisk get sizekhông tính đến không gian dành riêng tho ... trong powershell get-volumetrả về tổng kích thước thực tế (tức là trừ đi không gian dành riêng), nhưng khi tôi thử get-volume | format-list sizenó cho biết tổng kích thước cộng với không gian dành riêng ... làm cách nào để lấy tổng kích thước trừ đi không gian dành riêng cho mỗi ổ đĩa với powershell ???
oldboy

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, tôi đã khôi phục bản chỉnh sửa của bạn. Điều này cho thấy kết quả được đưa ra, có giá trị đối với những người chọn câu trả lời cho kết quả của nó. Đó là một dòng để sao chép và dán.
quux

2

Tôi biết về các công cụ psExec mà bạn có thể tải xuống từ đây

Có một psinfo.exe từ gói công cụ. Cách sử dụng cơ bản theo cách sau đây trong powershell / cmd.

nhập mô tả hình ảnh ở đây

Tuy nhiên, bạn có thể có rất nhiều lựa chọn với nó

Cách sử dụng: psinfo [[\ computer [, computer [, ..] | @file [-u user [-p psswd]]] [-h] [-s] [-d] [-c [-t delimiter]] [filter]

\ computer Thực hiện lệnh trên máy tính từ xa hoặc các máy tính được chỉ định. Nếu bạn bỏ qua tên máy tính, lệnh chạy trên hệ thống cục bộ và nếu bạn chỉ định ký tự đại diện (\ *), lệnh sẽ chạy trên tất cả các máy tính trong miền hiện tại.

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

bộ lọc Psinfo sẽ chỉ hiển thị dữ liệu cho trường phù hợp với bộ lọc. ví dụ: "dịch vụ psinfo" chỉ liệt kê trường gói dịch vụ.


0

Tôi từ xa vào máy tính bằng Enter-PSsession pcName, sau đó tôi gõ Get-PSDrive

Điều đó sẽ liệt kê tất cả các ổ đĩa và dung lượng được sử dụng và còn lại. Nếu bạn cần xem tất cả thông tin đã định dạng, hãy chuyển nó sang FL như sau: Get-PSdrive | FL *


0

Tôi đã tạo chức năng đơn giản này để giúp tôi. Điều này làm cho các cuộc gọi của tôi dễ đọc hơn rất nhiều khi có nội dòng câu lệnh Get-WmiObject , Where-Object , v.v.

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 là "Máy tính từ xa". Điều này đã không làm việc cho tôi trên ổ gắn kết, nhưng điều đó có lẽ là vào cuối của tôi ...
Yumi Koizumi

0

Trong trường hợp bạn muốn kiểm tra nhiều ký tự ổ đĩa và / hoặc bộ lọc giữa ổ đĩa cục bộ và ổ đĩa mạng, bạn có thể sử dụng PowerShell để tận dụng lợi thế của lớp WMI Win32_LogicalDisk . Đây là một ví dụ nhanh:

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

Tôi đã sử dụng kỹ thuật trên để tạo tập lệnh Powershell kiểm tra tất cả các ổ đĩa và gửi cảnh báo qua e-mail bất cứ khi nào chúng xuống dưới hạn ngạch do người dùng xác định. Bạn có thể lấy nó từ bài đăng này trên blog của tôi.


0

PowerShell Fun

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

0

Chỉ cần tìm thấy lệnh Get-Volume , nó sẽ trả về SizeRemaining, vì vậy (Get-Volume -DriveLetter C).SizeRemaining / (1e+9)có thể sử dụng một cái gì đó tương tự để xem Gb còn lại cho đĩa C. Có vẻ hoạt động nhanh hơn Get-WmiObject Win32_LogicalDisk.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.