web-dev-qa-db-fra.com

Powershell: tableaux bidimensionnels

Les travaux suivants fonctionnent comme prévu:

$values = @( ("a", "b"), ("c", "d") )
foreach($value in $values)
{
  write-Host "Value 0 =" $value[0]
  write-Host "Value 1 =" $value[1]
}

qui se traduit (1) par:

Value 0 = a
Value 1 = b
Value 0 = c
Value 1 = d

Mais si je change la variable $ values ​​en:

$values = @( ("a", "b") )

le résultat (2) est:

Value 0 = a
Value 1 =
Value 0 = b
Value 1 =

alors que je m'attendais à ce que le résultat (3) soit:

Value 0 = a
Value 1 = b

Modification de la valeur $ en:

$values = @( ("a"), ("b") )

donne le même résultat que le résultat (2) ci-dessus. Ce sont des représentations de données très différentes.

Le script que j'écris doit pouvoir gérer des tableaux bidimensionnels où la première dimension a une longueur de 0 à N. Je voudrais pouvoir écrire le script de sorte que si un élément de premier niveau doit être ajouté ( ou supprimé) que je n'ai pas à changer la logique du script; J'aimerais pouvoir simplement modifier les "données".

Ma question est donc la suivante: comment noter un tableau à deux dimensions pour que la boucle foreach affichée fonctionne correctement lorsque la première dimension du tableau a une longueur de 1?

get-Host répond avec:

Name             : ConsoleHost
Version          : 2.0
InstanceId       : 2338657f-e474-40d8-9b95-7e2b5f6a8acf
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace
11
Michael Frederick

Il s'agit d'un autre cas où le comportement de gestion des baies de PowerShell peut entraîner des résultats inattendus.

Je pense que vous devrez utiliser l'astuce virgule (l'opérateur de tableau) pour obtenir le résultat souhaité:

$values = @( ,("a", "b") )
foreach($value in $values)
{
  write-Host "Value 0 =" $value[0]
  write-Host "Value 1 =" $value[1]
}

Résultat:

Value 0 = a
Value 1 = b

En fait, tout ce dont vous avez besoin est le suivant:

$values = ,("a", "b")

Cet article explique plus sur la gestion des tableaux par PowerShell:

http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx

14
Andy Arismendi