web-dev-qa-db-fra.com

Imprimer un tableau dans Powershell

J'essaie d'imprimer un tableau (j'ai essayé les deux avec une boucle for et directement avec .ToString()), mais j'obtiens toujours un System.Object sortie.

Le contenu du tableau est le résultat de cette commande:

$singleOutput = Invoke-Command -ComputerName $server -ScriptBlock {
    Get-ChildItem C:\*.txt -Recurse |
        Select-String -Pattern "password" -AllMatches
}

Voici le résultat que j'obtiens:

System.Object []

Qu'est-ce que je rate?

MODIFIER:

Ceci est la fonction entière:

foreach ($server in $servidores) {
    $result = @()
    Write-Output ("---Searching on Server:---" + $server + "----at:" +
        (Get-Date).ToString() + "----")
    $singleOutput = Invoke-Command -ComputerName $server -ScriptBlock {
        Get-ChildItem C:\*.txt -Recurse |
            Select-String -Pattern "password" -AllMatches
    }
    $result += $singleOutput

    Write-Host $result.ToString()
}
Read-Host -Prompt "Press Enter to exit"

J'ai aussi essayé avec:

foreach ($i in $result) {
    $result[$i].ToString()
}
16
Alexander Meise

Vous utilisez Select-String, qui produit MatchInfo objets. Puisqu'il semble que vous voulez toutes les lignes correspondantes des fichiers, vous devriez probablement renvoyer uniquement la valeur de la propriété Line des objets MatchInfo. En outre, la manipulation de votre tableau est trop compliquée. Vient de sortir tout ce que Invoke-Command retourne et capture la sortie de la boucle dans une variable. Pour la sortie de statut à l'intérieur de la boucle, utilisez Write-Host, pour que les messages ne soient pas capturés dans $result.

$result = foreach ($server in $servidores) {
    Write-Host ("--- Searching on Server: $server at: " + (Get-Date).ToString())
    Invoke-Command -ComputerName $server -ScriptBlock {
        Get-ChildItem C:\*.txt -Recurse |
            Select-String -Pattern "password" -AllMatches |
            Select-Object -Expand Line
    }
}

Si vous avez également besoin du nom d'hôte, vous pouvez l'ajouter avec un propriété calculée et renvoyer des objets personnalisés:

$result = foreach ($server in $servidores) {
    Write-Host ("--- Searching on Server: $server at: " + (Get-Date).ToString())
    Invoke-Command -ComputerName $server -ScriptBlock {
        Get-ChildItem C:\*.txt -Recurse |
            Select-String -Pattern "password" -AllMatches |
            Select-Object @{n='Server';e={$env:COMPUTERNAME}},Line
    }
}

Vous produisez un tableau simplement en faisant écho à la variable tableau:

PS C: \> $ résultat
 Ligne du serveur 
 ------ ---- 
 ... ...

Pour obtenir une sortie au format personnalisé, vous pouvez par exemple utiliser le opérateur de formatage (-f):

$result | ForEach-Object {
  '{0}: {1}' -f $_.Server, $_.Line
}
35
Ansgar Wiechers