2017-07-06 11 views
-1

パラメータが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+)", '$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

目的は何ですか。コンピュータ名とpingに応答したかどうかを含むCSVファイルを作成しますか? –

+0

@Bill_Stewartこれは、ユーザーがログインしていないコンピュータの一覧を取得することを目的としています。 – russell

+0

@ ruslive109:説明を直接更新してください。コメントは使用しないでください。また、それは多くのコードであり、具体的にどこに問題があるのか​​わかりません。 [MCVE(最小、完全、および検証可能な例)](http://stackoverflow.com/help/mcve)の提供を検討してください。 – mklement0

答えて

0

foreachループの外側に配列を作成し、foreach中に$ server変数の値を配列に追加します。最後に、配列をcsvにエクスポートします。

+0

問題になるのは、 'Export-CSV'コマンドレットで' -Append'を使用していないことです。そのファイルは引き続き上書きされます。それはあなたが持っている問題ですか? –

+0

はいファイルは自身をオーバーライドし続けます。 – russell

+0

'Export-Csv 'H:\ demo \ session \ run1.csv''に' -Append'を追加します 'Export-Csv' H:\ demo \ session \ run1.csv '-Append' –

0

テストされていませんが、このようなことをしたいですか?

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

はい。更新された質問に完全なスクリプトを追加しました。 – russell

関連する問題