web-dev-qa-db-ja.com

Powershellで配列を印刷する

配列を出力しようとしています(forループと.ToString()を直接使用してみました)が、常にSystem.Object出力。

配列の内容はこのコマンドの結果です:

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

これは私が得ている出力です:

System.Object []

私は何が欠けていますか?

編集:

これは機能全体です。

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"

私も試しました:

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

MatchInfoオブジェクトを生成するSelect-Stringを使用しています。ファイルの一致する行全体が必要なように見えるため、おそらくLineオブジェクトのMatchInfoプロパティの値のみを返す必要があります。また、配列の処理は非常に複雑です。 Invoke-Commandが返すものをすべて出力し、ループ出力を変数にキャプチャします。ループ内のステータス出力にはWrite-Hostを使用して、$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
    }
}

ホスト名も必要な場合は、 計算プロパティ でホスト名を追加し、カスタムオブジェクトを返すことができます。

$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
    }
}

配列変数をエコーするだけで配列を出力します。

PS C:\> $ result
サーバー回線
 ------ ---- 
 ... ...

カスタム形式の出力を取得するには、たとえば format operator-f)を使用できます。

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