So erhalten Sie Festplattenkapazität und freien Speicherplatz auf einem Remotecomputer

116

Ich habe diesen Einzeiler:

get-WmiObject win32_logicaldisk -Computername remotecomputer

und die Ausgabe ist folgende:

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   :

Wie komme ich Freespaceund Sizevon DeviceID C:? Ich muss nur diese beiden Werte ohne weitere Informationen extrahieren. Ich habe es mit versuchtSelect Cmdlet , aber ohne Wirkung.

Bearbeiten: Ich muss nur die numerischen Werte extrahieren und sie in Variablen speichern.

Culter
quelle

Antworten:

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

$disk.Size
$disk.FreeSpace

So extrahieren Sie nur die Werte und weisen sie einer Variablen zu:

$disk = Get-WmiObject Win32_LogicalDisk -ComputerName remotecomputer -Filter "DeviceID='C:'" |
Foreach-Object {$_.Size,$_.FreeSpace}
Shay Levy
quelle
17
Durch einfaches Hinzufügen von $ disk.Size / 1GB wird das Ergebnis auch besser lesbar.
Ricky89
8
Wenn Sie die Anzeige runden möchten, um nur ganze Zahlen anzuzeigen, verwenden Sie[Math]::Round($Disk.Freespace / 1GB)
user4317867
in Powershell, warum gibt 1mbein Wert von 1048576und nicht zurück 1000000????
Oldboy
@oldboy, weil es Potenzen von 2: 2 ^ 20 vs. 10 ^ 6 verwendet. Es sollte zwar geschrieben sein 1MiB(mit der richtigen Groß- und Kleinschreibung), wird aber normalerweise in Kleinbuchstaben ohne das "i" angezeigt. Siehe Mebibyte .
Matthieu
127

Viel einfachere Lösung:

Get-PSDrive C | Select-Object Used,Free

und für Remote-Computer (Bedürfnisse Powershell Remoting)

Invoke-Command -ComputerName SRV2 {Get-PSDrive C} | Select-Object PSComputerName,Used,Free
Nullzeiger usw.
quelle
Installieren Sie PSTools und tun Siepsexec -u administrator \\[computer name or IP] powershell "get-psdrive C"
Ch.Idea
@ JacobEvans ansible?
Kiquenet
Wenn Sie sich authentifizieren müssen, muss der "Kerberos-Authentifizierungsmechanismus" auf dem Remotecomputer aktiviert sein.
Eddie Kumar
44

Nur ein Befehl einfach süß und sauber, aber dies funktioniert nur für lokale Festplatten

Get-PSDrive

Geben Sie hier die Bildbeschreibung ein

Sie können diesen Befehl weiterhin auf einem Remoteserver verwenden, indem Sie einen Enter-PSSession -Computername Servername ausführen und dann Get-PSDrive ausführen. Dadurch werden die Daten so abgerufen, als hätten Sie sie vom Server ausgeführt.

grepit
quelle
19

Ich habe vor einiger Zeit eine erweiterte PowerShell-Funktion (Skript-Cmdlet) erstellt, mit der Sie mehrere Computer abfragen können.

Der Code für die Funktion ist etwas mehr als 100 Zeilen lang. Sie finden ihn hier: PowerShell-Version des Befehls df

Beispiele finden Sie im Abschnitt Verwendung . Das folgende Verwendungsbeispiel fragt eine Reihe von Remotecomputern ab (Eingabe aus der PowerShell-Pipeline) und zeigt die Ausgabe in einem Tabellenformat mit numerischen Werten in lesbarer Form an:

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
quelle
Ich möchte diese Funktion verwenden, aber die Blogspot-Domain ist für mich gesperrt. Könnten Sie bitte die Funktion hier einfügen?
Kevin Panko
1
der gleiche Link im Webarchiv: web.archive.org/web/20150614115736/http://…
Thomas
Get-DiskFree scheint in PowerShell 2.0
Geoff Dawdy
11

Bei den anderen Vorschlägen sind zwei Probleme aufgetreten

    1) Laufwerkszuordnungen werden nicht unterstützt, wenn Sie die Powershell unter Task Scheduler ausführen
    2) Möglicherweise wird Ihnen der Zugriff verweigert. Fehler Fehler beim Versuch, "get-WmiObject" auf Remotecomputern zu verwenden (natürlich abhängig von Ihrer Infrastruktureinrichtung).

Die Alternative, die unter diesen Problemen nicht leidet, ist die Verwendung von GetDiskFreeSpaceEx mit einem UNC-Pfad:

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
quelle
Danke, nette Lösung, aber haben wir eine ähnliche Funktion, um UNCpath für alle Benutzer zu erhalten
user149621
Funktioniert die PowerShell-Methode für zugeordnete Laufwerke, wenn sie nicht von TaskScheduler verwendet wird?
Bill Greer
10

Eine andere Möglichkeit besteht darin, einen String in ein WMI-Objekt umzuwandeln:

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

Sie können die Ergebnisse auch durch 1 GB oder 1 MB teilen, wenn Sie verschiedene Einheiten möchten:

$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

Ausgabe ist: Remotecomputer C: has 252.7 GB free of 298.0 GB Total

Greg Bray
quelle
@ BillGreer Weiß nicht ohne weiteres, aber ich habe oft festgestellt, dass WMI-Anrufe langsamer als PS sind. Sie können selbst mit Measure-Command testen, aber stellen Sie sicher, dass Sie es einige Male ausführen und die Ergebnisse mitteln.
duct_tape_coder
7

Befehlszeile:

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

Ausgabe:

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

Befehlszeile:

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

aus:

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

Befehlszeile:

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

aus:

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
quelle
2
Das ist lächerlich.
Alexander Trauzzi
warum @AlexanderTrauzzi?
Kiquenet
1
wmic logicaldisk get sizeberücksichtigt nicht den reservierten Speicherplatz, obwohl ... in Powershell get-volumedie praktische Gesamtgröße (dh minus reservierter Speicherplatz) zurückgegeben wird, aber wenn ich es versuche get-volume | format-list size, wird die Gesamtgröße plus der reservierte Speicherplatz angezeigt ... wie erhalte ich die Gesamtgröße minus reservierten Speicherplatz? für jedes Laufwerk mit Powershell ???
Oldboy
6
Get-PSDrive C | Select-Object @{ E={$_.Used/1GB}; L='Used' }, @{ E={$_.Free/1GB}; L='Free' }
leorzz
quelle
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
quelle
1
Nathan, ich habe deine Bearbeitung zurückgesetzt. Dies zeigt die angegebene Ausgabe, die für diejenigen wertvoll ist, die eine Antwort für ihre Ergebnisse auswählen. Es ist eine Zeile zum Kopieren und Einfügen.
Quux
2

Ich kenne psExec-Tools, die Sie hier herunterladen können

Es gibt eine psinfo.exe aus dem Tools-Paket. Die grundlegende Verwendung erfolgt auf folgende Weise in Powershell / cmd.

Geben Sie hier die Bildbeschreibung ein

Sie könnten jedoch viele Optionen damit haben

Verwendung: psinfo [[\ computer [, computer [, ..] | @file [-u Benutzer [-p psswd]]] [-h] [-s] [-d] [-c [-t Trennzeichen]] [Filter]

\ computer Führen Sie den Befehl auf dem oder den angegebenen Remotecomputern aus. Wenn Sie den Computernamen weglassen, wird der Befehl auf dem lokalen System ausgeführt, und wenn Sie einen Platzhalter (\ *) angeben, wird der Befehl auf allen Computern in der aktuellen Domäne ausgeführt.

@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 zeigt nur Daten für das Feld an, das dem Filter entspricht. Beispiel: "psinfo service" listet nur das Feld "Service Pack" auf.

Himanshu Chauhan
quelle
0

Ich gehe mit Enter-PSsession pcName auf den Computer und tippe dann ein Get-PSDrive ein

Dadurch werden alle verwendeten und verbleibenden Laufwerke und Speicherplätze aufgelistet. Wenn Sie alle formatierten Informationen sehen möchten, leiten Sie sie wie folgt an FL weiter: Get-PSdrive | FL *

Michael Dark
quelle
0

Ich habe diese einfache Funktion erstellt, um mir zu helfen. Dies erleichtert das Lesen meiner Aufrufe erheblich , da ich ein Get-WmiObject , Where-Object- Anweisungen usw. inline habe .

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
quelle
1
OP war "Remote Computer". Dies funktionierte nicht für mich auf einem montierten Laufwerk, aber das war wahrscheinlich mein Ende ...
Yumi Koizumi
0

Wenn Sie mehrere Laufwerksbuchstaben überprüfen und / oder zwischen lokalen Laufwerken und Netzwerklaufwerken filtern möchten, können Sie mit PowerShell die WMI- Klasse Win32_LogicalDisk nutzen . Hier ist ein kurzes Beispiel:

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

Ich habe die oben beschriebene Technik verwendet, um ein Powershell-Skript zu erstellen, das alle Laufwerke überprüft und eine E-Mail-Benachrichtigung sendet, wenn sie ein benutzerdefiniertes Kontingent unterschreiten. Sie können es von diesem Beitrag auf meinem Blog erhalten.

Darkseal
quelle
0

PowerShell-Spaß

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