it-swarm.com.de

So erhalten Sie Festplattenkapazität und freien Speicherplatz des Remote-Computers

Ich habe diesen Einzeiler:

get-WmiObject win32_logicaldisk -Computername remotecomputer

und die Ausgabe ist dies:

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 bekomme ich Freespace und Size von DeviceIDC:? Ich muss nur diese beiden Werte ohne weitere Informationen extrahieren. Ich habe es mit Select cmdlet ausprobiert, jedoch ohne Wirkung.

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

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

$disk.Size
$disk.FreeSpace

Um nur die Werte zu extrahieren und einer Variablen zuzuweisen:

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

Viel einfachere Lösung:

Get-PSDrive C | Select-Object Used,Free

und für Remote-Computer (benötigt Powershell Remoting)

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

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 Usage. Das folgende Verwendungsbeispiel fragt eine Reihe von Remotecomputern (Eingabe aus der PowerShell-Pipeline) ab und zeigt die Ausgabe in einem Tabellenformat mit numerischen Werten in einer für Menschen lesbaren 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
18
mweisel

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

Get-PSDrive

 enter image description here

Sie können diesen Befehl weiterhin auf einem Remote-Server verwenden, indem Sie einen Enter-PSSession -Computername-Servernamen ausführen und dann das Get-PSDrive ausführen. Dabei werden die Daten so abgerufen, als würden Sie sie vom Server ausführen.

18
grepit

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 unterschiedliche Einheiten wünschen:

$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

8
Greg Bray

Bei den anderen Vorschlägen gab es zwei Probleme

    1) Laufwerkszuordnungen werden nicht unterstützt, wenn Sie die Powershell unter Taskplaner ausführen
    2) Sie können bekommen Zugriff wird verweigert Fehler Fehler beim Versuch, "get-WmiObject" auf Remote-Computern zu verwenden (natürlich abhängig von Ihrer Infrastruktureinrichtung)

Die Alternative, die nicht unter diesen Problemen leidet, ist die Verwendung 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
    } 
}
8
Warren Stevens

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
5
STTR
Get-PSDrive C | Select-Object @{ E={$_.Used/1GB}; L='Used' }, @{ E={$_.Free/1GB}; L='Free' }
4
user926782

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

Es kommt eine psinfo.exe aus dem Tools-Paket. Die grundlegende Verwendung erfolgt in Powershell/cmd folgendermaßen.

enter image description here

Sie könnten jedoch viele Optionen damit haben

Verwendung: psinfo [[\ Computer [ Computer [ ..] | @ datei [-u benutzer [- p psswd]]] [-h] [-s] [-d] [-c [-t Trennzeichen]] [Filter]

\ computer Führen Sie den Befehl auf dem oder den angegebenen Remote-Computern aus. Wenn Sie den Computernamen nicht angeben, 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. z.B. "psinfo-Dienst" listet nur das Service Pack-Feld auf.

2
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> 
2
quux

Wenn Sie mehrere Laufwerksbuchstaben prüfen und/oder zwischen lokalen und Netzlaufwerken filtern möchten, können Sie mithilfe der PowerShell die Klasse Win32_LogicalDisk WMI nutzen. Hier 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 obige 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 in meinem Blog erhalten.

0
Darkseal

Ich entferne den Computer mit Enter-PSsession pcName Und gebe dann Get-PSDrive ein.

Daraufhin werden alle Laufwerke und Speicherplätze aufgelistet und verwendet. Wenn Sie alle Informationen formatiert anzeigen möchten, leiten Sie sie wie folgt an FL: Get-PSdrive | FL *

0
Michael Dark

Ich habe diese einfache Funktion erstellt, um mir zu helfen. Dies macht meine Anrufe viel einfacher zu lesen, dass Inline ein Get-WmiObject , Where-Object Anweisungen usw. hat.

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
0
Kaj Bonfils