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 DeviceID
C:
? 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.
$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}
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
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
Nur ein Befehl, einfach süß und sauber, dies funktioniert jedoch nur für lokale Festplatten
Get-PSDrive
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.
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
Bei den anderen Vorschlägen gab es zwei Probleme
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
}
}
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
Get-PSDrive C | Select-Object @{ E={$_.Used/1GB}; L='Used' }, @{ E={$_.Free/1GB}; L='Free' }
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.
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.
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>
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.
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 *
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