วิธีรับความจุดิสก์และพื้นที่ว่างของคอมพิวเตอร์ระยะไกล


118

ฉันมีซับเดียว:

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จากDeviceID C:อย่างไร? ฉันต้องการแยกเพียงสองค่านี้โดยไม่มีข้อมูลอื่น ๆ ฉันได้ลองใช้Selectcmdlet แล้ว แต่ไม่มีผลใด ๆ

แก้ไข: ฉันต้องการแยกค่าตัวเลขเท่านั้นและเก็บไว้ในตัวแปร

คำตอบ:


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

18
เพียงแค่เพิ่ม $ disk ขนาด / 1GB ทำให้อ่านผลได้มากขึ้นด้วย
ricky89

8
หากคุณต้องการปัดเศษจอแสดงผลเพื่อแสดงเฉพาะตัวเลขทั้งหมดให้ใช้[Math]::Round($Disk.Freespace / 1GB)
user4317867

ใน powershell ทำไม1mbคืนค่าเป็น1048576และไม่1000000?
oldboy

@oldboy เพราะใช้พลัง 2: 2 ^ 20 เทียบกับ 10 ^ 6 ควรเขียน1MiB(ด้วยตัวพิมพ์ที่เหมาะสม) แต่มักจะแสดงเป็นตัวพิมพ์เล็กโดยไม่มี "i" ดูMebibyte
Matthieu

129

วิธีแก้ปัญหาที่ง่ายกว่ามาก:

Get-PSDrive C | Select-Object Used,Free

และสำหรับคอมพิวเตอร์ระยะไกล (ความต้องการPowershell Remoting)

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

ติดตั้งPSToolsและทำpsexec -u administrator \\[computer name or IP] powershell "get-psdrive C"
Ch.Idea

@JacobEvans ตอบได้ไหม?
Kiquenet

หากคุณต้องการตรวจสอบสิทธิ์จะต้องเปิดใช้ "กลไกการพิสูจน์ตัวตน Kerberos" ในเครื่องระยะไกล
Eddie Kumar

46

เพียงคำสั่งเดียวที่เรียบง่ายและสะอาด แต่ใช้ได้กับดิสก์ภายในเครื่องเท่านั้น

Get-PSDrive

ใส่คำอธิบายภาพที่นี่

คุณยังสามารถใช้คำสั่งนี้บนเซิร์ฟเวอร์ระยะไกลได้โดยทำ Enter-PSSession -Computername ServerName จากนั้นเรียกใช้ Get-PSDrive ซึ่งจะดึงข้อมูลราวกับว่าคุณเรียกใช้จากเซิร์ฟเวอร์


19

ฉันสร้างฟังก์ชันขั้นสูงของ PowerShell (script cmdlet) ในขณะที่ย้อนกลับไปซึ่งช่วยให้คุณสามารถสืบค้นคอมพิวเตอร์หลายเครื่องได้

โค้ดสำหรับฟังก์ชันนี้มีความยาวมากกว่า 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

ฉันต้องการใช้ฟังก์ชันนี้ แต่โดเมนของ blogspot ถูกบล็อกสำหรับฉัน คุณช่วยใส่ฟังก์ชันที่นี่ได้ไหม
Kevin Panko

1
ลิงก์เดียวกันในที่เก็บถาวรของเว็บ: web.archive.org/web/20150614115736/http://…
Thomas

Get-DiskFree ดูเหมือนจะไม่มีใน PowerShell 2.0
Geoff Dawdy

11

มีสองปัญหาที่ฉันพบกับคำแนะนำอื่น ๆ

    1)ไม่รองรับการแมปไดรฟ์หากคุณเรียกใช้ powershell ภายใต้ตัวกำหนดตารางเวลางาน
    2)คุณอาจได้รับข้อผิดพลาดAccess ถูกปฏิเสธข้อผิดพลาดที่พยายามใช้ "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
    } 
}

ขอบคุณทางออกที่ดี แต่เรามีฟังก์ชั่นที่คล้ายกันในการรับ UNCpath สำหรับผู้ใช้ทั้งหมดหรือไม่
user149621

วิธี PowerShell สำหรับไดรฟ์ที่แมปเมื่อไม่ได้ใช้โดย TaskScheduler หรือไม่
Bill Greer

10

อีกวิธีหนึ่งคือการส่งสตริงไปยังวัตถุ 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: has 252.7 GB free of 298.0 GB Total



@BillGreer ไม่ทราบล่วงหน้า แต่ฉันมักพบว่า WMI โทรช้ากว่า PS คุณสามารถทดสอบด้วยคำสั่งการวัดได้ด้วยตัวเอง แต่อย่าลืมเรียกใช้หลายครั้งและหาค่าเฉลี่ยผลลัพธ์
duct_tape_coder

7

บรรทัดคำสั่ง:

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,562

บรรทัดคำสั่ง:

wmic 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        B80A0F40

บรรทัดคำสั่ง:

wmic 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

2
นี่มันไร้สาระ
Alexander Trauzzi

ทำไม @AlexanderTrauzzi?
Kiquenet

1
wmic logicaldisk get sizeไม่ได้คำนึงถึงพื้นที่ที่สงวนไว้ ... ใน powershell get-volumeจะส่งคืนขนาดทั้งหมดที่ใช้งานได้จริง (เช่นลบพื้นที่ที่สงวนไว้) แต่เมื่อฉันลองget-volume | format-list sizeบอกว่าขนาดรวมบวกพื้นที่ที่สงวนไว้ ... ฉันจะได้ขนาดทั้งหมดลบพื้นที่ที่สงวนไว้ได้อย่างไร สำหรับแต่ละไดรฟ์ด้วย powershell ???
oldboy


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
นาธานฉันย้อนการแก้ไขของคุณแล้ว สิ่งนี้แสดงผลลัพธ์ที่กำหนดซึ่งมีค่าสำหรับผู้ที่เลือกคำตอบสำหรับผลลัพธ์ คัดลอกและวางบรรทัดเดียว
quux

2

ฉันรู้จักเครื่องมือ psExec ซึ่งคุณสามารถดาวน์โหลดได้จากที่นี่

มี psinfo.exe มาจากชุดเครื่องมือ การใช้งานพื้นฐานเป็นไปในลักษณะต่อไปนี้ใน powershell / cmd

ใส่คำอธิบายภาพที่นี่

อย่างไรก็ตามคุณสามารถมีตัวเลือกมากมาย

การใช้งาน: psinfo [[\ computer [, คอมพิวเตอร์ [, .. ] | @file [-u ผู้ใช้ [-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" แสดงเฉพาะฟิลด์เซอร์วิสแพ็ค


0

ฉันเข้าคอมพิวเตอร์ระยะไกลโดยใช้Enter-PSsession pcName จากนั้นฉันพิมพ์Get-PSDrive

ซึ่งจะแสดงรายการไดรฟ์และพื้นที่ทั้งหมดที่ใช้และเหลืออยู่ หากคุณต้องการดูข้อมูลทั้งหมดที่จัดรูปแบบให้ไปที่ FL ดังนี้: Get-PSdrive | ฟลอริดา *


0

ฉันสร้างฟังก์ชันง่ายๆนี้ขึ้นมาเพื่อช่วยฉัน สิ่งนี้ทำให้การโทรของฉันง่ายขึ้นมากในการอ่านว่ามีคำสั่งGet-WmiObject , Where-Objectแบบอินไลน์และอื่น ๆ

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 คือ "คอมพิวเตอร์ระยะไกล" สิ่งนี้ไม่ได้ผลสำหรับฉันบนไดรฟ์ที่ติดตั้ง แต่นั่นอาจจะเป็นจุดจบของฉัน ...
Yumi Koizumi

0

ในกรณีที่คุณต้องการตรวจสอบตัวอักษรหลายไดรฟ์และ / หรือตัวกรองระหว่างไดรฟ์ท้องถิ่นและเครือข่ายคุณสามารถใช้ 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 ที่ตรวจสอบไดรฟ์ทั้งหมดและส่งการแจ้งเตือนทางอีเมลเมื่อใดก็ตามที่มีค่าต่ำกว่าโควต้าที่ผู้ใช้กำหนด คุณสามารถรับได้จากโพสต์นี้ในบล็อกของฉัน


0

PowerShell สนุก

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

0

เพิ่งพบคำสั่งGet-Volumeซึ่งส่งคืนSizeRemainingดังนั้นสิ่งที่ต้องการ(Get-Volume -DriveLetter C).SizeRemaining / (1e+9)สามารถใช้เพื่อดู Gb ที่เหลืออยู่สำหรับดิสก์ C ดูเหมือนจะทำงานได้เร็วกว่าGet-WmiObject Win32_LogicalDisk.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.