원격 컴퓨터의 디스크 용량과 여유 공간을 얻는 방법


116

이 한 줄짜리가 있습니다.

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   :

어떻게받을 수 있나요 FreespaceSizeDeviceID 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.Size / 1GB 만 추가하면 결과도 더 읽기 쉬워집니다.
ricky89

8
[Math]::Round($Disk.Freespace / 1GB)
정수만

powershell에서 왜 ???가 아닌 1mb값을 반환 합니까 ? 10485761000000
oldboy

@oldboy는 2 : 2 ^ 20 대 10 ^ 6의 거듭 제곱을 사용하기 때문입니다. 실제로 작성되어야 1MiB하지만 (적절한 대소 문자 사용) 일반적으로 "i"없이 소문자로 표시됩니다. Mebibyte를 참조하십시오 .
Matthieu

128

훨씬 더 간단한 솔루션 :

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 2015

@JacobEvans ansible?
Kiquenet

인증이 필요한 경우 원격 컴퓨터에서 활성화 된 "Kerberos 인증 메커니즘"이 필요합니다.
에디 쿠마

45

단 하나의 명령으로 간단하고 깔끔하지만 이것은 로컬 디스크에서만 작동합니다.

Get-PSDrive

여기에 이미지 설명 입력

Enter-PSSession -Computername ServerName을 수행하여 원격 서버에서이 명령을 계속 사용할 수 있으며 Get-PSDrive를 실행하면 마치 서버에서 실행 한 것처럼 데이터를 가져옵니다.


19

이전에 여러 컴퓨터를 쿼리 할 수있는 PowerShell 고급 기능 (스크립트 cmdlet)을 만들었습니다.

함수의 코드는 100 줄이 조금 넘으므로 여기에서 찾을 수 있습니다. df 명령의 PowerShell 버전

예제 는 사용법 섹션을 확인하십시오 . 다음 사용 예제는 원격 컴퓨터 집합 (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) 원격 컴퓨터에서 "get-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

TaskScheduler에서 사용하지 않는 경우 매핑 된 드라이브에 대한 PowerShell 메서드가 있습니까?
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보다 느린 경우가 많습니다. Measure-Command로 직접 테스트 할 수 있지만 여러 번 실행하고 결과를 평균화해야합니다.
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예약 된 공간을 고려하지 get-volume않음 tho ... powershell 에서 실제 총 크기 (예 : 예약 된 공간 빼기)를 반환하지만 시도 get-volume | format-list size할 때 총 크기와 예약 된 공간을 더한 값이 표시됩니다. 총 크기에서 예약 된 공간을 빼려면 어떻게해야하나요? powershell이있는 각 드라이브에 대해 ???
oldboy

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
Nathan, 편집을 롤백했습니다. 이것은 결과에 대한 답을 선택하는 사람들에게 유용한 주어진 출력을 보여줍니다. 복사하여 붙여 넣을 한 줄입니다.
quux

2

여기 에서 다운로드 할 수있는 psExec 도구를 알고 있습니다.

도구 패키지에서 psinfo.exe가 제공됩니다. powershell / cmd에서 기본 사용법은 다음과 같습니다.

여기에 이미지 설명 입력

그러나 당신은 그것으로 많은 옵션을 가질 수 있습니다

사용법 : psinfo [[\ computer [, computer [, ..] | @file [-u 사용자 [-p psswd]]] [-h] [-s] [-d] [-c [-t 구분 기호]] [필터]

\ computer 지정된 원격 컴퓨터에서 명령을 수행합니다. 컴퓨터 이름을 생략하면 명령이 로컬 시스템에서 실행되고 와일드 카드 (\ *)를 지정하면 명령이 현재 도메인의 모든 컴퓨터에서 실행됩니다.

@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는 필터와 일치하는 필드의 데이터 만 표시합니다. 예를 들어 "psinfo service"는 서비스 팩 필드 만 나열합니다.


0

Enter-PSsession pcName 을 사용하여 컴퓨터에 원격으로 접속 한 다음 Get-PSDrive를 입력합니다.

그러면 사용 및 남은 모든 드라이브와 공간이 나열됩니다. 포맷 된 모든 정보를 확인해야하는 경우 다음과 같이 FL에 파이프합니다. Get-PSdrive | FL *


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는 "원격 컴퓨터"였습니다. 이 탑재 된 드라이브에 나를 위해 작동하지 않았다,하지만 ... 내 말에 아마이었다
유미 고이즈미

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)디스크 C에 대해 남아있는 Gb를 확인하는 데 사용할 수 있습니다 Get-WmiObject Win32_LogicalDisk.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.