2017-10-16 6 views
0

Donc, j'ai le code ci-dessous qui fonctionne très bien, mais pour une raison quelconque, il calcule seulement mon lecteur D: et pas aussi mon lecteur C:?powershell lecteurs calculatrice

$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

Votre lecteur 'D:' est-il un lecteur de type '3' (disque local)? Pas un disque amovible ('2') ou un disque compact (' 5')? – BACON

+0

Mon lecteur D: est un disque dur mécanique et mon lecteur C: est un disque SSD. – luanswan2002

+0

Désolé, je l'ai lu en arrière; donc c'est _only_ calculant le lecteur 'D:'. Quoi qu'il en soit, tout cela dépend de ce qui est stocké dans «$ computerHDD». Si 'Get-Wmiobject Win32_LogicalDisk' ne retourne pas tous les disques que vous attendez, ils ne seront jamais traités dans la boucle' ForEach'. – BACON

Répondre

2

semble que vous auriez besoin de faire un tableau. Essayez ceci ...

$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

Merci cela fonctionne très bien. Seul petit niggle est qu'il produit deux listes similaires, la différence étant le SSD/HDD. – luanswan2002

+0

Je ne suis pas sûr de ce que vous voulez dire. Parlez-vous des étiquettes? – ShanayL

0

Vous écrasez $txtObject à chaque itération de la boucle, de sorte que votre sortie ne contient que le lecteur de la version finale. Au lieu de cela, vous devriez initialisez $txtObject comme un tableau, puis annexant les informations de chaque disque que:

$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 

Mieux encore, vous pouvez éliminer la boucle et la variable et il suffit d'utiliser le pipeline:

$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 

Notez que New-Object ci-dessus est presque identique à votre code d'origine, sauf que $_ doit être utilisé au lieu de $HDD.