Understanding (advanced) Foreach-Object

Hi guys, i'm new here.

I'm new to powershell (learning it only two months or something like that) and this is my 4th script

which is started in a very basic way, of two commands



After reading and asking a lot of questions , some people told me that my script have to much text and i can simplify it by using a PSCustomobject, what ended as a new problem, because i had problems with the  output, so i asked more question, and finally got a solution that will do what my first script does (almost)

here is the first version of the script 

$computers= "localhost"

foreach ($pc in $computers){

$test_connection = Test-Connection -ComputerName $pc -Count 2

$test_netconnection = Test-NetConnection $pc -Port 1433

[pscustomobject] @{
       LocalPC                     =$test_connection.PSComputerName;
       'now testing server: '  =$test_netconnection.ComputerName
       Bytes                          =$test_connection.buffersize
       Time                           =$test_connection.ResponseTime
       RemotePort                =$test_netconnection.RemotePort

}|ft -AutoSize

here is the output for this (if i set the "test-connection" count parameter to 1, i'm not getting this result):

LocalPC now testing server: Bytes Time RemotePort
------- ------------------- ----- ---- ----------
{LEVL-01, LEVL-01} localhost {32, 32} {0, 0} 1433

i didn't knew how to make it show only one line even if i use two tests of test-connection, i understand that powershell store it in Arrey, but i didn't knew what can i do with that, untill this one guy in some forum writed this script:


foreach ($pc in $computers)
$test_netconnection = Test-NetConnection $pc -Port 1433

Test-Connection -ComputerName $pc -Count 2 |
    ForEach-Object {
    [pscustomobject] @{
                                        LocalPC          =$_.PSComputerName
                                       'Tested-Server' =$test_netconnection.ComputerName
                                        Bytes               =$_.buffersize
                                        Time                =$_.ResponseTime
                             RemotePort                =$test_netconnection.RemotePort
                  TcpTestSucceeded                =$test_netconnection.TcpTestSucceeded

} | ft -AutoSize #end of Customobject


i didn't knew that you use foreach-object like that, until now i've seen on youtube and CBT and some other instructions, a use of that in a some lines that looks
something like that get-blahblah |foreach-object {blabhalbha}.

can some one explain me what he did here? he used this "$_" sign (i understand what it mean - foreach-object that pass through the pipeline) but how can it be that it's not showing the result as double.

PS: during the writing of the post, i've started to wonder, how can i add "if statement" to this kind of a script where do i add it? inside the pipeline? because if there is some connectivity problem i don't want the script to stop on one server, i need to make it check all the servers to know on which of them there is problem 

Thanks a lot for your help.