Question Hashtable dans un hashtable possible?

Plus d'informations
il y a 15 ans 5 mois #2873 par Tarik
Bonjour à tous,

Est il possible de placer un hashtable dans un hashtable et d'y acceder par la suite??
[code:1]function ReadFileSystem()
{
$AllDiskDrive = GWMI -CL Win32_DiskDrive
$diskID = 0
[hashtable]$Devices =@{}
Write-host \"Disk number: \"$AllDiskDrive.Count

foreach($diskDrive in $AllDiskDrive){
$strDriveDeviceID = [string]$diskDrive.deviceid
$Devices.\"$diskID\" = @{DeviceID=\"\";ID=\"\";Status=\"\";Partition=\"\";type=\"\";LogicalDisks=\"\"}
$Devices.\"$diskID\".Set_item(\"ID\",$diskID)
$Devices.\"$diskID\".Set_item(\"DeviceID\",$strDriveDeviceID)
$Devices.\"$diskID\".Set_item(\"Status\",\"NONE\"«»)
$Devices.\"$diskID\".Set_item(\"TotalSize\",[string]$diskDrive.Size /1GB«»)

$query1 = \"Associators of {Win32_DiskDrive.DeviceID='$strDriveDeviceID'} where AssocClass=Win32_DiskDriveToDiskPartition\"
$colPartitions = get-wmiobject -query $query1

if($colPartitions -eq $NULL){
Write-host -f red \"No partitions\"
$Devices.\"$diskID\".Set_item(\"Partition\",\"0\"«»)
}else{

if($colPartitions.Count -eq 1){
$Devices.\"$diskID\".Set_item(\"Partition\",\"1\"«»)
}else{
$Devices.\"$diskID\".Set_item(\"Partition\",$colPartitions.Count)
}

foreach($colPart in $colPartitions) {
$strPartitionDeviceID = [string]$colPart.DeviceID
$query2 = \"Associators of {Win32_DiskPartition.DeviceID='$strPartitionDeviceID'} where AssocClass=Win32_LogicalDiskToPartition\"
$colLogicalDisks = Get-WmiObject -query $query2

if($colLogicalDisks){
[hashtable]$LogicalDisks = @{}
$i = 0
foreach($colLogicalDisk in $colLogicalDisks){
$LogicalDisks.\"$i\" = @{Type=\"\";Size=\"\";FreeSpace=\"\";DriveType=\"\";MediaType=\"\";VolumeName=\"\";DeviceID=\"\";}
Write-host \"Disk Size: \"($diskDrive.Size /1GB«»)
Write-host \"SCSILogicalUnit: \"$diskDrive.SCSILogicalUnit
Write-host \"SCSITargetId: \"$diskDrive.SCSITargetId
Write-host \"Partitions: \"$diskDrive.Partitions
Write-host \"DiskID: \"$diskID \" has \"$diskDrive.Partitions \" partition(s)\"
Write-host \"Physical Disk:\" $diskDrive.caption \" -- \" $diskDrive.deviceid
Write-host \"Disk Partition: \" $colPart.DeviceID
Write-host \"DriveType: \"$colLogicalDisk.DriveType
Write-host \"MediaType: \"$colLogicalDisk.MediaType
Write-host \"VolumeName: \"$colLogicalDisk.VolumeName
Write-host \"Logical Disk: \" $colLogicalDisk.deviceid
Write-host \"FreeSpace: \" ($colLogicalDisk.FreeSpace /1GB«»)
Write-host \"Logical Size:\" ($colLogicalDisk.Size /1GB«»)
Write-host
[string]$var = $colLogicalDisk.Size /1GB
$LogicalDisks.\"$i\".Set_item(\"Size\",[string]$var)
$LogicalDisks.\"$i\".Set_item(\"FreeSpace\",[string]$colLogicalDisk.FreeSpace)
$LogicalDisks.\"$i\".Set_item(\"DriveType\",[string]$colLogicalDisk.DriveType)
$LogicalDisks.\"$i\".Set_item(\"MediaType\",[string]$colLogicalDisk.MediaType)
$LogicalDisks.\"$i\".Set_item(\"VolumeName\",[string]$colLogicalDisk.VolumeName)
$LogicalDisks.\"$i\".Set_item(\"DeviceID\",[string]$colLogicalDisk.deviceid)
$type = FindLogicalDiskType $colLogicalDisk.deviceid $colLogicalDisk.DriveType $colLogicalDisk.Size
$LogicalDisks.\"$i\".Set_item(\"Type\",[string]$type)

$i++
}
$Devices.\"$diskID\".Set_item(\"LogicalDisks\",$LogicalDisks)
}else{
Write-host \"There is no Logical Disk on \" $colPart.DeviceID
$type = FindDriveType $diskDrive.Size
$Devices.\"$diskID\".Set_item(\"Type\",[string]$type)
}
}
}
$diskID++
}
CreateSanDiskConfigFile $diskID $Devices
} [/code:1]

Ce code permet de lister les disques dur et leur partition si il y en a.
Le code place les logicalDisk(hashtable) dans un autre hashtable (Devices)
Le probleme est qu'ensuite je n'arrive pas à récupérer les données provenant des logicalDisk..

J'aimerais savoir si mon procédé est correct?
Ou Quelqu'un a t'il des suggestions?

Bien à vous tous,
Tarik<br><br>Message édité par: Tartar, à: 1/10/08 14:45

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 5 mois #2879 par Laurent Dardenne
Salut,
Tartar écrit:

J'aimerais savoir si mon procédé est correct?

Oui.
Il y a un pb de copier coller du à \&quot;une collision de nom de variable\&quot; il me semble :
[code:1]
$type = FindLogicalDiskType $colLogicalDisks.\&quot;$i\&quot;.deviceid $colLogicalDisks.\&quot;$i\&quot;.DriveType $colLogicalDisks.\&quot;$i\&quot;.Size
[/code:1]
$colLogicalDisks avec un S

Sinon les lignes du type suivante peuvent être simplifiées :
[code:1]
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;ID\&quot;,$diskID)
[/code:1]
en
[code:1]
$Devices.\&quot;$diskID\&quot;.ID=$diskID
[/code:1]
Et pour l'affichage
[code:1]
Echo $Devices.\&quot;$diskID\&quot;.totalsize
#par contre au sein d'une string
Echo \&quot;Taille= $($Devices.\&quot;$diskID\&quot;.totalsize)\&quot;
[/code:1]
ç'est bien utile cette construction, n'est-ce pas ?
En Pascal il existe le type record, similaire une struct du C# :
[code:1]
type
TCorrespondanceCsv= Record
NomCsv : ShortString;
NomSql : ShortString;
NumeroColonne : Byte;
End;

var
Correspondance: TCorrespondanceCsv
begin
Correspondance.NomCsv=\&quot;Test\&quot;;
[/code:1]
Dommage qu'il ne soit pas possible de créer ce type de structure sans passer par une hastable, au niveau performance je ne suis pas sûr que cela soit efficace. Mais c'est un compromis.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 5 mois #2890 par Tarik
Merci pour ces conseils

Bon je n'ai pas réussi à placer un hashtable dans un hashtable donc j'ai contourné le problème en mettant les infos dans un array.

ci dessous le code:

[code:1]function GetDevices{
$AllDiskDrive = GWMI -CL Win32_DiskDrive
$diskID = 0
[hashtable]$Devices =@{}
Write-host \&quot;Disk number: \&quot;$AllDiskDrive.Count
## Check all Disk Drive
foreach($diskDrive in $AllDiskDrive){
$strDriveDeviceID = [string]$diskDrive.deviceid
$Devices.\&quot;$diskID\&quot; = @{DeviceID=\&quot;\&quot;;ID=\&quot;\&quot;;Status=\&quot;\&quot;;TotalSize=\&quot;\&quot;;Partition=\&quot;\&quot;;Type=\&quot;\&quot;;LogicalDisks=\&quot;\&quot;}
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;ID\&quot;,$diskID)
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;DeviceID\&quot;,$strDriveDeviceID)
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;TotalSize\&quot;,[string]$diskDrive.Size /1GB«»)

## Check all Partitions on the Disk
$query1 = \&quot;Associators of {Win32_DiskDrive.DeviceID='$strDriveDeviceID'} where AssocClass=Win32_DiskDriveToDiskPartition\&quot;
$colPartitions = get-wmiobject -query $query1

if($colPartitions -eq $NULL){
Write-host -f red \&quot;No partitions\&quot;
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;Partition\&quot;,\&quot;0\&quot;«»)
$type = FindDriveType ($diskDrive.Size /1GB«»)
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;Type\&quot;,[string]$type)
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;Status\&quot;,\&quot;READY\&quot;«»)
}else{
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;Status\&quot;,\&quot;LOCKED\&quot;«»)
if($colPartitions.Count -ge 2){
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;Partition\&quot;,$colPartitions.Count)
}else{
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;Partition\&quot;,\&quot;1\&quot;«»)
}
## Check All Logical Disk of partitionss
$ArrLogicalDisks = GetLogicalDisk($colPartitions)
$Devices.\&quot;$diskID\&quot;.Set_item(\&quot;LogicalDisks\&quot;,$ArrLogicalDisks)
}
$diskID++
}
$ArrDevices = $diskID,$Devices
return $ArrDevices
} [/code:1]
[code:1] function GetLogicalDisk($colPartitions){
[array]$ArrLDisk = $NULL
foreach($colPart in $colPartitions) {
$strPartitionDeviceID = [string]$colPart.DeviceID
$query2 = \&quot;Associators of {Win32_DiskPartition.DeviceID='$strPartitionDeviceID'} where AssocClass=Win32_LogicalDiskToPartition\&quot;
$colLogicalDisks = Get-WmiObject -query $query2

if($colLogicalDisks){
[hashtable]$LogicalDisks = @{}
$i = 0

foreach($colLogicalDisk in $colLogicalDisks){
$LogicalDisks = @{Type=\&quot;\&quot;;Size=\&quot;\&quot;;FreeSpace=\&quot;\&quot;;DriveType=\&quot;\&quot;;MediaType=\&quot;\&quot;;Caption=\&quot;\&quot;;Description=\&quot;\&quot;;VolumeName=\&quot;\&quot;;DeviceID=\&quot;\&quot;;SystemName=\&quot;\&quot;;ProviderName=\&quot;\&quot;}
[string]$var = $colLogicalDisk.Size /1GB
$LogicalDisks.Set_item(\&quot;Size\&quot;,[string]$var)
$LogicalDisks.Set_item(\&quot;FreeSpace\&quot;,[string]$colLogicalDisk.FreeSpace)
$LogicalDisks.Set_item(\&quot;DriveType\&quot;,[string]$colLogicalDisk.DriveType)
$LogicalDisks.Set_item(\&quot;MediaType\&quot;,[string]$colLogicalDisk.MediaType)
$LogicalDisks.Set_item(\&quot;VolumeName\&quot;,[string]$colLogicalDisk.VolumeName)
$LogicalDisks.Set_item(\&quot;Name\&quot;,[string]$colLogicalDisk.Name)
$LogicalDisks.Set_item(\&quot;Caption\&quot;,[string]$colLogicalDisk.Caption)
$LogicalDisks.Set_item(\&quot;Description\&quot;,[string]$colLogicalDisk.Description)
$LogicalDisks.Set_item(\&quot;SystemName\&quot;,[string]$colLogicalDisk.SystemName)
$LogicalDisks.Set_item(\&quot;ProviderName\&quot;,[string]$colLogicalDisk.ProviderName)
$type = FindLogicalDiskType $colLogicalDisk.deviceid $colLogicalDisk.DriveType $colLogicalDisk.Size
$LogicalDisks.Set_item(\&quot;Type\&quot;,[string]$type)
$ArrLDisk += ,$LogicalDisks
$i++
}
}else{
Write-host \&quot;There is no Logical Disk on \&quot; $colPart.DeviceID
}
}
return $ArrLDisk
}[/code:1]

merci pour votre aide.
Tarik

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 5 mois #2892 par Laurent Dardenne
De mon coté avec le code suivant :
[code:1]
function ReadFileSystem()
{
$AllDiskDrive = GWMI -CL Win32_DiskDrive
$diskID = 0
[hashtable]$Devices =@{}

foreach($diskDrive in $AllDiskDrive){
$strDriveDeviceID = [string]$diskDrive.deviceid
$Devices.\&quot;$diskID\&quot; = @{DeviceID=\&quot;\&quot;;Status=\&quot;\&quot;;Partition=\&quot;\&quot;;type=\&quot;\&quot;;LogicalDisks=\&quot;\&quot;}
$Devices.\&quot;$diskID\&quot;.DeviceID=$strDriveDeviceID
$Devices.\&quot;$diskID\&quot;.Status=\&quot;NONE\&quot;
$Devices.\&quot;$diskID\&quot;.TotalSize=[string]$diskDrive.Size /1GB

$query1 = \&quot;Associators of {Win32_DiskDrive.DeviceID='$strDriveDeviceID'} where AssocClass=Win32_DiskDriveToDiskPartition\&quot;
$colPartitions = get-wmiobject -query $query1

if($colPartitions -eq $NULL){
Write-host -f red \&quot;No partitions\&quot;
$Devices.\&quot;$diskID\&quot;.Partition=0
}
else
{
$Devices.\&quot;$diskID\&quot;.Partition=$colPartitions.Count
}

foreach($colPart in $colPartitions) {
$strPartitionDeviceID = [string]$colPart.DeviceID
$query2 = \&quot;Associators of {Win32_DiskPartition.DeviceID='$strPartitionDeviceID'} where AssocClass=Win32_LogicalDiskToPartition\&quot;
$colLogicalDisks = Get-WmiObject -query $query2
if($colLogicalDisks){
[hashtable]$LogicalDisks = @{}
$i = 0
foreach($colLogicalDisk in $colLogicalDisks){
$LogicalDisks.\&quot;$i\&quot; = @{Type=\&quot;\&quot;;Size=\&quot;\&quot;;FreeSpace=\&quot;\&quot;;DriveType=\&quot;\&quot;;MediaType=\&quot;\&quot;;VolumeName=\&quot;\&quot;;DeviceID=\&quot;\&quot;;}
Write-host \&quot;Disk Size: \&quot;($diskDrive.Size /1GB«»)
Write-host \&quot;SCSILogicalUnit: \&quot;$diskDrive.SCSILogicalUnit
Write-host \&quot;SCSITargetId: \&quot;$diskDrive.SCSITargetId
Write-host \&quot;Partitions: \&quot;$diskDrive.Partitions
Write-host \&quot;DiskID: \&quot;$diskID \&quot; has \&quot;$diskDrive.Partitions \&quot; partition(s)\&quot;
Write-host \&quot;Physical Disk:\&quot; $diskDrive.caption \&quot; -- \&quot; $diskDrive.deviceid
Write-host \&quot;Disk Partition: \&quot; $colPart.DeviceID
Write-host \&quot;DriveType: \&quot;$colLogicalDisk.DriveType
Write-host \&quot;MediaType: \&quot;$colLogicalDisk.MediaType
Write-host \&quot;VolumeName: \&quot;$colLogicalDisk.VolumeName
Write-host \&quot;Logical Disk: \&quot; $colLogicalDisk.deviceid
Write-host \&quot;FreeSpace: \&quot; ($colLogicalDisk.FreeSpace /1GB«»)
Write-host \&quot;Logical Size:\&quot; ($colLogicalDisk.Size /1GB«»)
Write-host
[string]$var = $colLogicalDisk.Size /1GB
$LogicalDisks.\&quot;$i\&quot;.Size=$var
$LogicalDisks.\&quot;$i\&quot;.FreeSpace=[string]$colLogicalDisk.FreeSpace
$LogicalDisks.\&quot;$i\&quot;.DriveType=[string]$colLogicalDisk.DriveType
$LogicalDisks.\&quot;$i\&quot;.MediaType=[string]$colLogicalDisk.MediaType
$LogicalDisks.\&quot;$i\&quot;.VolumeName=$colLogicalDisk.VolumeName
$LogicalDisks.\&quot;$i\&quot;.DeviceID=[string]$colLogicalDisk.deviceid
$i++
}
$Devices.\&quot;$diskID\&quot;.LogicalDisks=$LogicalDisks
}
}
$diskID++
}
$devices
}

$HD=ReadFileSystem
[/code:1]
Ensuite:
[code:1]
&gt;$hd
Name Value
----
0 {LogicalDisks, type, Partition, Status...}
1 {LogicalDisks, type, Partition, Status...}


&gt; $hd.\&quot;0\&quot;
Name Value
----
LogicalDisks {0}
type
Partition
Status NONE
DeviceID \\.\PHYSICALDRIVE1
TotalSize 149,048187732697


&gt; $hd.\&quot;0\&quot;.logicalDisks.\&quot;0\&quot;
Name Value
----
Size 149.048156738281
VolumeName Secondaire
Type
FreeSpace 34208002048
MediaType 12
DriveType 3
DeviceID G:

&gt;$hd.\&quot;0\&quot;.logicalDisks.\&quot;0\&quot;.VolumeName
Secondaire
[/code:1]
n'ayant pas de disque partitionné :
[code:1]
#récupère les infos, en les dupliquant, de de la partition 1 : clé 0
$P=($hd.\&quot;0\&quot;.logicalDisks.\&quot;0\&quot;«»).Clone()
# avec $P=$hd.\&quot;0\&quot;.logicalDisks.\&quot;0\&quot; on récupére la même référence de hashtable
$p.VolumeName=\&quot;Test\&quot;
#l'ajoute à la HT logicalDisks avec une nouvelle clé nommé \&quot;1\&quot;
$hd.\&quot;0\&quot;.logicalDisks.\&quot;1\&quot;=$p
$hd.\&quot;0\&quot;.logicalDisks
Name Value
----
0 {Size, VolumeName, Type, FreeSpace...}
1 {Size, VolumeName, Type, FreeSpace...}
$hd.\&quot;0\&quot;.logicalDisks.\&quot;0\&quot;.VolumeName
#Secondaire
$hd.\&quot;0\&quot;.logicalDisks.\&quot;1\&quot;.VolumeName
#Test
#Test l'affectation de hashtable
$Ld=$hd.\&quot;0\&quot;.logicalDisks
$hd.\&quot;0\&quot;.logicalDisks=$null
$hd.\&quot;0\&quot;.logicalDisks
#Vide
$hd.\&quot;0\&quot;.logicalDisks=$Ld
$hd.\&quot;0\&quot;.logicalDisks

Name Value
----
0 {Size, VolumeName, Type, FreeSpace...}
1 {Size, VolumeName, Type, FreeSpace...}
#Vérification
$hd.\&quot;0\&quot;.logicalDisks.\&quot;0\&quot;.VolumeName
#Secondaire
$hd.\&quot;0\&quot;.logicalDisks.\&quot;1\&quot;.VolumeName
#Test
[/code:1]
J'ai du mal à voir ce qui cela ne fonctionne pas.
Pour info on peut créer une hashtable dont la clé est un objet :
[code:1]
$HO=@{}
$HO.$p=10
$HO

Name Value
----
{Size, VolumeName, Type, Fr... 10
[/code:1]
Mais là n'est pas le sujet.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 5 mois #2958 par Tarik
merci ca m'a aidé

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.080 secondes
Propulsé par Kunena