2016-01-26 6 views
1

J'ai ce morceau de code:lecture de CSV produit des entrées en double dans la variable

$servers = Import-Csv "sources.csv" 
$computername = $servers.server 
$ServiceName = $servers.services 

sources.csv contient les éléments suivants ..

Server,Services 
BRWS40,winrm 
BRWS84,winrm

J'ai alors foreach et le Write-Host est dans ce , il sort ceci:

Write-Host "$computername - $ServiceName" -ForegroundColor black -BackgroundColor red 

Sortie d'en haut je reçois est:

BRWS40 BRWS84 - winrm winrm

Alors que je voulais avoir un ordinateur et un service par ligne.

BRWS40 - winrm

Qu'est-ce que je fais mal?

J'ai modifié le code de here.

Répondre

1

Vous avez en fait une boucle par le résultat:

$servers = Import-Csv "sources.csv" 

$servers | %{ 
    $computername = $_.server 
    $ServiceName = $_.services 

    write-host "$computername - $ServiceName" -foregroundcolor black -backgroundcolor red 
} 

ou utilisez l'applet de commande Format-Table:

$servers | Format-Table 
+0

Merci pour vos deux réponses, je peux maintenant modifier cela et terminer mon script. J'ai vu le serveur $ _. Utilisé auparavant, mais je n'ai pas compris comment il a été utilisé. J'en ai maintenant une meilleure compréhension. Je suis en train de créer un script qui exécutera et vérifiera divers services sur différents ordinateurs. en utilisant le code emprunté à partir de quelques sites, ce site est vraiment une aide précieuse. Merci encore, c'est vraiment apprécié. . – yardyy

2

$servers = Import-Csv "sources.csv" importe le contenu de sources.csv comme une liste d'objets personnalisés dans la variable $servers.

$computername = $servers.server Sélectionne la valeur de la propriété server de chaque objet dans la variable $computername, générant ainsi une liste de noms d'ordinateur.

$ServiceName = $servers.services Sélectionne la valeur de la propriété services de chaque objet dans la variable $ServiceName, générant ainsi une liste de noms de service. Notez que $array.property ne fonctionnera que dans PowerShell version 3 et ultérieure, car les versions antérieures ne déroulent pas automatiquement le tableau pour obtenir les propriétés de l'élément, mais essaient d'accéder à la propriété de l'objet tableau lui-même. Si le tableau n'a pas une telle propriété, le résultat sera $null, sinon ce sera la valeur de la propriété du tableau. De toute façon, ce ne sera pas ce que vous voulez. Pour les travaux d'agrandissement de la propriété dans toutes les versions PowerShell utilisent Select-Object -Expand ou font écho à la propriété dans un communiqué ForEach-Object:

$computername = $servers | Select-Object -Expand server 
$computername = $servers | ForEach-Object { $_.server } 

Lorsque vous mettez des variables de tableau dans une chaîne ("$computername - $ServiceName") les éléments du tableau sont reliés par le caractère $OFS (espace par défaut), alors "$computername" devient BRWS40 BRWS84 et "$ServiceName" devient winrm winrm.

Pour obtenir le nom de service correspondant pour chaque ordinateur que vous devez traiter $servers dans une boucle, par exemple:

foreach ($server in $servers) { 
    Write-Host ('{0} - {1}' -f $server.Server, $server.Services) ... 
} 

Si vous n'avez pas besoin d'un format de sortie spécifique, vous pouvez également utiliser l'un des Format-* applets de commande, par exemple Format-Table:

Import-Csv "sources.csv" | Format-Table -AutoSize