120 votes

Boucler un hachage ou utiliser un tableau dans PowerShell

J'utilise ce morceau de code (simplifié) pour extraire un ensemble de tables du serveur SQL avec BCP .

$OutputDirectory = 'c:\junk\'
$ServerOption =   "-SServerName"
$TargetDatabase = "Content.dbo."

$ExtractTables = @(
    "Page"
    , "ChecklistItemCategory"
    , "ChecklistItem"
)

for ($i=0; $i -le $ExtractTables.Length – 1; $i++)  {
    $InputFullTableName = "$TargetDatabase$($ExtractTables[$i])"
    $OutputFullFileName = "$OutputDirectory$($ExtractTables[$i])"
    bcp $InputFullTableName out $OutputFullFileName -T -c $ServerOption
}

Cela fonctionne très bien, mais maintenant certaines tables doivent être extraites via des vues, et d'autres non. J'ai donc besoin d'une structure de données semblable à celle-ci :

"Page"                      "vExtractPage"
, "ChecklistItemCategory"   "ChecklistItemCategory"
, "ChecklistItem"           "vExtractChecklistItem"

Je me suis penché sur les hachages, mais je n'ai rien trouvé sur la façon de boucler un hachage. Quelle serait la bonne chose à faire ici ? Peut-être utiliser un tableau, mais avec les deux valeurs, séparées par un espace ?

Ou ai-je oublié quelque chose d'évident ?

7voto

user1161625 Points 504

Voici une autre méthode rapide, qui consiste à utiliser la clé comme index dans la table de hachage pour obtenir la valeur :

$hash = @{
    'a' = 1;
    'b' = 2;
    'c' = 3
};

foreach($key in $hash.keys) {
    Write-Host ("Key = " + $key + " and Value = " + $hash[$key]);
}

4voto

José Alvarez Points 33

Une courte traversée peut également être donnée en utilisant l'opérateur de sous-expression $( ), qui renvoie le résultat d'une ou de plusieurs déclarations.

$hash = @{ a = 1; b = 2; c = 3}

forEach($y in $hash.Keys){
    Write-Host "$y -> $($hash[$y])"
}

Résultat :

a -> 1
b -> 2
c -> 3

0voto

Aaron Jensen Points 5170

Si vous utilisez PowerShell v3, vous pouvez utiliser JSON au lieu d'une table de hachage, et la convertir en objet avec Convert-FromJson :

@'
[
    {
        FileName = "Page";
        ObjectName = "vExtractPage";
    },
    {
        ObjectName = "ChecklistItemCategory";
    },
    {
        ObjectName = "ChecklistItem";
    },
]
'@ | 
    Convert-FromJson |
    ForEach-Object {
        $InputFullTableName = '{0}{1}' -f $TargetDatabase,$_.ObjectName

        # In strict mode, you can't reference a property that doesn't exist, 
        #so check if it has an explicit filename firest.
        $outputFileName = $_.ObjectName
        if( $_ | Get-Member FileName )
        {
            $outputFileName = $_.FileName
        }
        $OutputFullFileName = Join-Path $OutputDirectory $outputFileName

        bcp $InputFullTableName out $OutputFullFileName -T -c $ServerOption
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X