在循环中导出每个变量值

Exporting each variable value in loop

每次参数通过 foreach 循环时,我都试图捕获不断变化的变量“$server”。总而言之,$sever 值一直在变化,我想捕获它并将其添加到一个集体 csv 文件中

谢谢!

这是我所拥有的代码的主要部分。

 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+)", '  none  ' -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
}
}

在 foreach 循环之外创建一个数组,并在 foreach 期间将 $server 变量值添加到该数组。最后将数组导出到 csv。

未测试,但你想做这样的事情吗?

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