2017-10-16 5 views
0

그래서 아주 잘 작동하지만 아래의 코드를 가지고 있습니다. 그러나 어떤 이유에서든 내 D : 드라이브와 C : 드라이브가 아닌 것만 계산하고 있습니까?powershell 드라이브 계산기

$computerName = Get-Wmiobject Win32_ComputerSystem 
$computerOS = Get-Wmiobject Win32_OperatingSystem 
$computerHDD = Get-Wmiobject Win32_LogicalDisk -Filter drivetype=3 

ForEach($HDD in $computerHDD){ 
$txtObject = New-Object PSObject -property @{ 
    'ComputerName' = $computerName.Name 
    'ComputerModel' = $computerName.Model 
    'SerialNumber' = $computerName.SerialNumber 
    'HDDSize' = "{0:N2}" -f ($HDD.Size/1GB) 
    'HDDFree' = "{0:P2}" -f ($HDD.FreeSpace/$HDD.Size) 
    'OS' = $computerOS.caption 
    'OS_type' = $computerOS.OSArchitecture 
    'User' = $computerName.UserName 
    } 
} 
$txtObject | Select-Object ComputerName, ComputerModel, SerialNumber, HDDSize, HDDFree, OS, Os_type, User | Out-File "$PSSCriptRoot\computer_info.txt" -Append 
+0

'D :'드라이브가 '3'(로컬 디스크) 유형의 드라이브입니까? 이동식 디스크 ('2') 또는 컴팩트 디스크 ('5')가 아닙니까? – BACON

+0

My D : 드라이브는 기계식 하드 드라이브이고 C : 드라이브는 SSD입니다. – luanswan2002

+0

죄송합니다, 나는 그것을 거꾸로 읽었습니다. 그래서 그것은'D :'드라이브를 계산하는 것일뿐입니다. 어쨌든,이 모든 것은'$ computerHDD'에 저장되는 것에 달려 있습니다. 'Get-Wmiobject Win32_LogicalDisk'가 기대하는 모든 드라이브를 반환하지 않으면'ForEach' 루프에서 결코 처리되지 않습니다. – BACON

답변

2

여러분이 배열을 만들어야하는 것처럼 보입니다. 당신의 출력은 마지막 반복에서 드라이브를 포함, 그래서 당신은 루프의 모든 반복에 $txtObject을 덮어있어 ...

$computerName = Get-Wmiobject Win32_ComputerSystem 
$computerOS = Get-Wmiobject Win32_OperatingSystem 
$computerHDD = Get-Wmiobject Win32_LogicalDisk -Filter drivetype=3 

$output = @() 
ForEach($HDD in $computerHDD){ 
$txtObject = New-Object PSObject -property @{ 
    'ComputerName' = $computerName.Name 
    'ComputerModel' = $computerName.Model 
    'SerialNumber' = $computerName.SerialNumber 
    'HDDSize' = "{0:N2}" -f ($HDD.Size/1GB) 
    'HDDFree' = "{0:P2}" -f ($HDD.FreeSpace/$HDD.Size) 
    'OS' = $computerOS.caption 
    'OS_type' = $computerOS.OSArchitecture 
    'User' = $computerName.UserName 
    } 
    $output += $txtObject 
} 
$output | Select-Object ComputerName, ComputerModel, SerialNumber, HDDSize, HDDFree, OS, Os_type, User | Out-File "$PSSCriptRoot\computer_info.txt" -Append 
+0

고마워요. 꽤 잘 작동합니다. 작은 niggle만이 SSD/HDD라는 두 가지 유사한 목록을 생성한다는 것입니다. – luanswan2002

+0

무슨 뜻인지 잘 모르겠습니다. 라벨을 말하는거야? – ShanayL

0

을이보십시오. 대신 배열로 $txtObject를 초기화해야하며, 그 다음에 각 드라이브의 정보를 추가 :

$computerHDD = Get-Wmiobject Win32_LogicalDisk -Filter drivetype=3 

$txtObject = @() 
ForEach($HDD in $computerHDD){ 
    $txtObject += New-Object PSObject -property @{ 
     # ... 
    } 
} 
$txtObject | Select-Object ... | Out-File "$PSSCriptRoot\computer_info.txt" -Append 

더 나은 아직, 당신은 루프 변수를 제거하고 단지 파이프 라인을 사용할 수 있습니다

$computerName = Get-WmiObject Win32_ComputerSystem 
$computerOS = Get-WmiObject Win32_OperatingSystem 

Get-WmiObject Win32_LogicalDisk -Filter drivetype=3 ` 
    | ForEach-Object -Process { 
     New-Object PSObject -Property @{ 
      'ComputerName' = $computerName.Name 
      'ComputerModel' = $computerName.Model 
      'SerialNumber' = $computerName.SerialNumber 
      'HDDSize'  = "{0:N2}" -f ($_.Size/1GB) 
      'HDDFree'  = "{0:P2}" -f ($_.FreeSpace/$_.Size) 
      'OS'   = $computerOS.caption 
      'OS_type'  = $computerOS.OSArchitecture 
      'User'   = $computerName.UserName 
     }; 
    } | Out-File "$PSSCriptRoot\computer_info.txt" -Append 

을 위의 New-Object은 원래 코드와 거의 동일하지만 $_$HDD 대신 사용해야합니다.