2017-07-06 2 views
-1

J'essaie de capturer la variable variable '$ server' chaque fois que les paramètres passent par une boucle foreach. Pour récapituler, la valeur $ sever est toujours changeante, et je veux la capturer et l'ajouter dans un fichier csv collectifExportation de chaque valeur de variable dans la boucle

Merci!

Voici la partie principale du code que j'ai.

function Convert-QueryToObjects 
{ 
    [CmdletBinding()] 
    [Alias('QueryToObject')] 
    [OutputType([PSCustomObject])] 
    param 
    (
    [Parameter(Mandatory = $false, 
       ValueFromPipeline = $true, 
       ValueFromPipelineByPropertyName = $true, 
       Position = 0)] 
    [Alias('ComputerName', 'Computer')] 
    [string] 
    $Name = $env:COMPUTERNAME 
) 

Process 
{ 
    Write-Verbose "Running query.exe against $Name." 
    $Users = query user /server:$Name 2>&1 

    if ($Users -like "*No User exists*") 
    { 
     # Handle no user's found returned from query. 
     # Returned: 'No User exists for *' 
     Write-Error "There were no users found on $Name : $Users" 
     Write-Verbose "There were no users found on $Name." 
    } 
    elseif ($Users -like "*Error*") 
    { 
     # Handle errored returned by query. 
     # Returned: 'Error ...<message>...' 
     Write-Error "There was an error running query against $Name : $Users" 
     Write-Verbose "There was an error running query against $Name." 
    } 
    elseif ($Users -eq $null -and $ErrorActionPreference -eq 'SilentlyContinue') 
    { 
     # Handdle null output called by -ErrorAction. 
     Write-Verbose "Error action has supressed output from query.exe. Results were null." 
    } 
    else 
    { 
     Write-Verbose "Users found on $Name. Converting output from text." 

     # Conversion logic. Handles the fact that the sessionname column may be populated or not. 
     $Users = $Users | ForEach-Object { 
      (($_.trim() -replace ">" -replace "(?m)^([A-Za-z0-9]{3,})\s+(\d{1,2}\s+\w+)", '$1 none $2' -replace "\s{2,}", "," -replace "none", $null)) 
     } | ConvertFrom-Csv 

     Write-Verbose "Generating output for $($Users.Count) users connected to $Name." 

     # Output objects. 
     foreach ($User in $Users) 
     { 
      Write-Verbose $User 
      if ($VerbosePreference -eq 'Continue') 
      { 
       # Add '| Out-Host' if -Verbose is tripped. 
       [PSCustomObject]@{ 
        ComputerName = $Name 
        Username = $User.USERNAME 
        SessionState = $User.STATE.Replace("Disc", "Disconnected") 
        SessionType = $($User.SESSIONNAME -Replace '#', '' -Replace "[0-9]+", "") 

       } | Out-Host 
      } 
      else 
      { 
       # Standard output. 
       [PSCustomObject]@{ 
        ComputerName = $Name 
        Username = $User.USERNAME 
        SessionState = $User.STATE.Replace("Disc", "Disconnected") 
        SessionType = $($User.SESSIONNAME -Replace '#', '' -Replace "[0-9]+", "") 

       } 
      } 
     } 
    } 
} 
} 








$Servers = Get-Content 'H:\demo\computernames.txt' 

foreach ($Server in $Servers) 
{ 
if (-not(Test-Connection $Server -Count 1 -Quiet)) { continue } 

if (-not(Convert-QueryToObjects $Server -ErrorAction SilentlyContinue)) { 



     $server | Out-File 'H:\demo\session\run1.csv' -Append 


    } 
else 
{ 
    Convert-QueryToObjects -Name $Server | select ComputerName, Username, Sessionstate, IdleTime, ID | Export-Csv 'H:\demo\session\run.csv' -NoTypeInformation 
} 
} 
+0

Quel est le but? Créer un fichier CSV contenant des noms d'ordinateurs et s'ils ont répondu à un ping? –

+0

@Bill_Stewart Le but de ceci est d'obtenir une liste des ordinateurs qui n'ont aucun utilisateur connecté. – russell

+0

@ ruslive109: S'il vous plaît mettre à jour votre question directement avec des clarifications, ne pas utiliser les commentaires. En outre, c'est beaucoup de code, et nous ne savons pas, en particulier, où le problème est. Envisagez de fournir un [MCVE (exemple minimal, complet et vérifiable)] (http://stackoverflow.com/help/mcve). – mklement0

Répondre

0

Créez un tableau en dehors de votre boucle foreach et ajoutez la valeur de la variable $ server au tableau pendant votre foreach. À la fin, exportez le tableau vers un csv.

+0

une chose qui posera un problème est que vous n'utilisez pas '-Append' sur l'applet de commande' Export-CSV'. Ce fichier continuera d'être écrasé. Est-ce le problème que vous rencontrez? –

+0

oui le fichier continue de se substituer à lui-même. – russell

+0

Ajouter '-Append' à' Export-Csv 'H: \ demo \ session \ run1.csv'' Donc comme ceci: 'Export-Csv' H: \ demo \ session \ run1.csv '-Append' –

0

Non testé, mais voulez-vous faire quelque chose comme ça?

Get-Content "H:\demo\computernames.txt" | ForEach-Object { 
    $computerName = $_ 
    if (Test-Connection $computerName -Count 1 -Quiet) { 
    Convert-QueryToObjects $computerName -ErrorAction SilentlyContinue 
    } 
    else { 
    "$_ not pingable" | Out-File "H:\demo\session\notpingable.log" -Append 
    } 
} | Export-Csv "H:\demo\session\run.csv" -NoTypeInformation 
+0

Oui. J'ai ajouté le script complet dans la question mise à jour. – russell