23

I am trying to print an array (I tried both with a for loop and directly with .ToString()), but I allways get a System.Object output.

The content of the array is the result of this command:

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

This is the output I'm getting:

System.Object[]

What am I missing?

EDIT:

This is the whole function:

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"

I also tried with:

foreach ($i in $result) {
    $result[$i].ToString()
}
5
  • That's an array of objects, all right. Why are you printing it with 'tostring()'? What output do you want? Are you write-object or write-host 'ing it? Commented Sep 16, 2016 at 14:41
  • I then add $result += $singleOutput (declared first $result = @()) Commented Sep 16, 2016 at 14:43
  • I am using write-host Commented Sep 16, 2016 at 14:44
  • "$result" instead of $result.ToString() Commented Sep 16, 2016 at 15:14
  • Instead of Write-Host $result.toString(), use either Write-Host ($result -join "`r`n") or $result. Commented Sep 16, 2016 at 19:21

1 Answer 1

45

You're using Select-String, which produces MatchInfo objects. Since it looks like you want the whole matching lines from the files you probably should return just the value of the Line property of the MatchInfo objects. Also, your array handling is way too complicated. Just output whatever Invoke-Command returns and capture the loop output in a variable. For status output inside the loop use Write-Host, so that the messages don't get captured in $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
    }
}

If you also need the hostname you could add it with a calculated property and return custom objects:

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

You output an array simply by echoing the array variable:

PS C:\> $result
Server    Line
------    ----
...       ...

To get custom-formatted output you can for instance use the format operator (-f):

$result | ForEach-Object {
  '{0}: {1}' -f $_.Server, $_.Line
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.