डिस्क की क्षमता और दूरस्थ कंप्यूटर की खाली जगह कैसे प्राप्त करें


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
बस $ डिस्क जोड़ने। आकार / 1 जीबी परिणाम को और भी पठनीय बनाता है।
रिकॉय 8

8
यदि आप केवल पूर्ण संख्या दिखाने के लिए प्रदर्शन को गोल करना चाहते हैं, तो उपयोग करें[Math]::Round($Disk.Freespace / 1GB)
user4317867

powershell में क्यों करता है 1mbका मान प्रदान 1048576और नहीं 1000000????
ओल्डबॉय

@oldboy क्योंकि यह 2: 2 ^ 20 बनाम 10 ^ 6 की शक्तियों का उपयोग करता है। यह वास्तव में लिखा जाना चाहिए 1MiB(उचित मामले के साथ) लेकिन आमतौर पर निचले मामले में दिखाया जाता है, बिना वें "आई" के बिना। मेबिबाइट देखें ।
मैथ्यू

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 ansible?
कीकेनेट

यदि आपको प्रमाणित करने की आवश्यकता है, तो इसके लिए रिमोट मशीन में सक्षम "केर्बरोस प्रमाणीकरण तंत्र" की आवश्यकता होगी।
कुमार में एडी कुमार

46

सिर्फ एक आदेश सरल मीठा और साफ लेकिन यह केवल स्थानीय डिस्क के लिए काम करता है

Get-PSDrive

यहां छवि विवरण दर्ज करें

आप अभी भी एंटर-PSSession -Computername ServerName कर रिमोट सर्वर पर इस कमांड का उपयोग कर सकते हैं और फिर Get-PSDrive को चलाएं यह डेटा को खींच देगा जैसे कि आपने इसे सर्वर से चलाया था।


19

मैंने कुछ समय पहले एक PowerShell उन्नत फ़ंक्शन (स्क्रिप्ट cmdlet) बनाया था जो आपको कई कंप्यूटरों को क्वेरी करने की अनुमति देता है।

फ़ंक्शन के लिए कोड 100 से अधिक लंबी लाइनें है, इसलिए आप इसे यहां पा सकते हैं: 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

मैं इस फ़ंक्शन का उपयोग करना चाहूंगा, लेकिन ब्लॉगस्पॉट डोमेन मेरे लिए अवरुद्ध है। क्या आप कृपया यहाँ फ़ंक्शन शामिल कर सकते हैं?
केविन पेंको

1
वेब संग्रह पर एक ही लिंक: web.archive.org/web/20150614115736/http://…
थॉमस

Get-DiskFree PowerShell 2.0
Geoff Dawdy

11

अन्य मुद्दों के साथ मेरे दो मुद्दे हैं

    1) ड्राइव मैपिंग का समर्थन नहीं किया जाता है यदि आप कार्य शेड्यूलर के तहत शक्तियाँ चलाते हैं
    2) आपको प्राप्त हो सकता है प्रवेश से इनकार कर दिया गया है त्रुटियों का उपयोग करने की कोशिश कर रहे हैं दूरस्थ कंप्यूटर पर "प्राप्त करें- WmiObject" (आपके बुनियादी ढांचे की स्थापना के आधार पर, निश्चित रूप से)

वैकल्पिक है कि इन मुद्दों से ग्रस्त नहीं है एक UNC पथ के साथ GetDiskFreeSpaceEx का उपयोग करें :

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

टास्कस्किलर द्वारा उपयोग नहीं किए जाने पर मैप किए गए ड्राइव के लिए पॉवरशेल विधि क्या है?
बिल ग्रीर

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 18

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
यह मज़ाकीय है।
अलेक्जेंडर ट्रूज़े

क्यों @AlexanderTrauzzi?
कीनिकेत

1
wmic logicaldisk get sizeआरक्षित स्थान के लिए खाता नहीं है ... शक्तियों get-volumeमें व्यावहारिक कुल आकार (यानी माइनस आरक्षित स्थान) देता है, लेकिन फिर जब मैं कोशिश get-volume | format-list sizeकरता हूं कि यह कुल आकार और आरक्षित स्थान कहता है ... मुझे कुल आकार माइनस आरक्षित स्थान कैसे मिलता है शक्तियों के साथ प्रत्येक ड्राइव के लिए ???
ओल्डबॉय

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
नाथन, मैंने आपका संपादन वापस कर दिया है। यह दिए गए आउटपुट को दिखाता है, जो इसके परिणामों के लिए उत्तर का चयन करने वालों के लिए मूल्यवान है। यह कॉपी और पेस्ट करने के लिए एक पंक्ति है।
quux

2

मुझे psExec टूल्स का पता है जिसे आप यहाँ से डाउनलोड कर सकते हैं

उपकरण पैकेज से एक psinfo.exe आता है। मूल उपयोग, पॉवरशेल / cmd में निम्नलिखित तरीके से है।

यहां छवि विवरण दर्ज करें

हालाँकि आपके पास इसके साथ बहुत सारे विकल्प हो सकते हैं

उपयोग: psinfo [[\ कंप्यूटर], कंप्यूटर [, ..] | @file [-u उपयोगकर्ता [-p psswd]]] -h] [-s] [-d] [-c] [-t delimiter]] [फ़िल्टर]

\ कंप्यूटर निर्दिष्ट दूरस्थ कंप्यूटर या कंप्यूटर पर कमांड निष्पादित करें। यदि आप कंप्यूटर का नाम छोड़ते हैं, तो कमांड स्थानीय सिस्टम पर चलता है, और यदि आप वाइल्डकार्ड (\ *) निर्दिष्ट करते हैं, तो कमांड वर्तमान डोमेन के सभी कंप्यूटरों पर चलता है।

@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 | FL *


0

मैंने मेरी मदद करने के लिए यह सरल कार्य बनाया। इससे मेरे कॉल पढ़ने में बहुत आसान हो जाते हैं कि गेट-वमीओबजेक्ट , व्हेन -ऑब्जेक्ट स्टेटमेंट आदि को इनलाइन करना ।

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
ओपी "रिमोट कंप्यूटर" था। यह मेरे लिए माउंटेड ड्राइव पर काम नहीं करता था, लेकिन यह शायद मेरे अंत में था ...
Yumi Koizumi

0

यदि आप स्थानीय और नेटवर्क ड्राइव के बीच कई ड्राइव अक्षर और / या फ़िल्टर की जांच करना चाहते हैं, तो आप Win32_LogicalDisk WMI वर्ग का लाभ लेने के लिए PowerShell का उपयोग कर सकते हैं । यहाँ एक त्वरित उदाहरण है:

$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

पॉवरशेल मज़ा

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

0

बस गेट-वॉल्यूम कमांड मिला , जो वापस लौटता है SizeRemaining, इसलिए (Get-Volume -DriveLetter C).SizeRemaining / (1e+9)डिस्क सी के लिए Gb बने रहने के लिए कुछ ऐसा इस्तेमाल किया जा सकता है Get-WmiObject Win32_LogicalDisk

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.