help with powershell function

This topic contains 1 reply, has 2 voices, and was last updated by Profile photo of Daan Weda Daan Weda 4 days, 8 hours ago.

  • Author
    Posts
  • #58996
    Profile photo of michael schecter
    michael schecter
    Participant

    Hello all,
    Im trying to figure out why my function is behaving diffrently then i expect Im still learning and appreciate any advice given.
    I have some code that creates a session into a few computers then tests ports being open and returns the status.
    if I run the code top down (non function) it works fine. If i run it inside of a function it creates the sesion and completes but i get no output. I am rather new to functions so it may be a beginners mistake thanks in advance . code is below

      Working copy

    start-transcript -path c:\logs\ports.txt
    $s = New-PSSession server1,Server2
    Invoke-Command -Session $s -ScriptBlock {
    $hostname = Hostname
    $ComputerName = ("comp1","comp2","comp3")
    $Ports = ("8005")
    foreach ($Computer in $ComputerName)
    {

    foreach ($Port in $Ports)
    {

    # Create a Net.Sockets.TcpClient object to use for
    # checking for open TCP ports.
    $Socket = New-Object Net.Sockets.TcpClient

    # Suppress error messages
    $ErrorActionPreference = 'SilentlyContinue'

    # Try to connect
    $Socket.Connect($Computer, $Port)

    # Make error messages visible again
    $ErrorActionPreference = 'Continue'

    # Determine if we are connected.

    if ($Socket.Connected)
    {
    "$hostname ${Computer}: Port $Port is open"
    $Socket.Close()
    }
    else
    {
    "$hostname ${Computer}: Port $Port is closed or filtered"
    }

    # Apparently resetting the variable between iterations is necessary.
    $Socket.Dispose()
    $Socket = $null

    }

    }
    exit
    }Stop-Transcript
    Get-PSSession|Remove-PSSession

      Non-working code

    Function test-port
    {
    param ([string[]]$session,$ComputerName,[int[]]$ports)

    $s = New-PSSession $session
    Invoke-Command -Session $s -ScriptBlock {
    foreach ($Computer in $ComputerName)

    {

    foreach ($Port in $Ports)
    {

    # Create a Net.Sockets.TcpClient object to use for
    # checking for open TCP ports.
    $Socket = New-Object Net.Sockets.TcpClient

    # Suppress error messages
    $ErrorActionPreference = 'SilentlyContinue'

    # Try to connect
    $Socket.Connect($Computer, $Port)

    # Make error messages visible again
    $ErrorActionPreference = 'Continue'

    # Determine if we are connected.

    if ($Socket.Connected)
    {
    "$hostname ${Computer}: Port $Port is open"
    $Socket.Close()
    }
    else
    {
    "$hostname ${Computer}: Port $Port is closed or filtered"
    }

    # Apparently resetting the variable between iterations is necessary.
    $Socket.Dispose()
    $Socket = $null

    }

    }
    exit
    } -ArgumentList $ComputerName,$Ports
    }
    $session = "serv1","serv2","serv3"
    $ComputerName = ("comp1")
    $Ports = ("6379")
    test-port -session $session -ComputerName $ComputerName -ports $Ports

  • #59034
    Profile photo of Daan Weda
    Daan Weda
    Participant

    I don't really understand why you have this logic in your script.
    To start with it looks like you don't pass in any parameters into the scriptblok of invoke-command.

    Function test-port
     {
     param ([string[]]$session,
    $ComputerName,[int[]]$ports) 
    
    $s = New-PSSession $session
    Invoke-Command -Session $s -ScriptBlock {param($ComputerName,$Ports)
     foreach ($Computer in $ComputerName)
    
    {
    
    foreach ($Port in $Ports)
     {
    
    # Create a Net.Sockets.TcpClient object to use for
     # checking for open TCP ports.
     $Socket = New-Object Net.Sockets.TcpClient
    
    # Suppress error messages
     $ErrorActionPreference = 'SilentlyContinue'
    
    # Try to connect
     $Socket.Connect($Computer, $Port)
    
    # Make error messages visible again
     $ErrorActionPreference = 'Continue'
    
    # Determine if we are connected.
    
    if ($Socket.Connected)
     {
     "$hostname ${Computer}: Port $Port is open"
     $Socket.Close()
     }
     else
     {
     "$hostname ${Computer}: Port $Port is closed or filtered"
     }
    
    # Apparently resetting the variable between iterations is necessary.
     $Socket.Dispose()
     $Socket = $null
    
    }
    
    }
    
     } -ArgumentList $ComputerName,$Ports
    
    
     }
    $session = "serv1","serv2","serv3"
     $ComputerName = ("comp1")
     $Ports = ("6379")
     test-port -session $session -ComputerName $ComputerName -ports $Ports

You must be logged in to reply to this topic.