Search code examples
vb.netpowershellsystem.management

Running powershell in VB.NET - how to access the content of my variable


I am running a simple script in VB using System.Management.Automation as below

Script runs fine, but how do I then access content of $offline and $online in my code after it has run?

 Dim scriptContents = New StringBuilder()

    scriptContents.AppendLine("$computers = @(""PC-1"", ""PC-2"", ""PC-3"")")

    scriptContents.AppendLine("$online = @()")
    scriptContents.AppendLine("$offline = @()")

    scriptContents.AppendLine("Foreach ($computer in $computers) {")

    scriptContents.AppendLine("If (Test-Connection -ComputerName $computer -Count 2 -Quiet -ErrorAction SilentlyContinue) {")
    scriptContents.AppendLine("$online += $computer")
    scriptContents.AppendLine("}")
    scriptContents.AppendLine("Else {")
    scriptContents.AppendLine("$offline += $computer")
    scriptContents.AppendLine("}")
    scriptContents.AppendLine("}")

     Using ps As PowerShell = PowerShell.Create()

        ps.AddScript(scriptContents.ToString)

        Dim results1 As PSDataCollection(Of PSObject) = Await Task.Run(Function() ps.InvokeAsync)

        Stop

    End Using

Thanks


Solution

  • I think the solution is to not have the script create two separate arrays, but instead have it return one array of PSObjects where each item has two properties: Computer and a Boolean Online.

    Something like this perhaps:

    Dim scriptContents = New StringBuilder()
    
    scriptContents.AppendLine("$computers = @(""PC-1"", ""PC-2"", ""PC-2"")")
    scriptContents.AppendLine("Foreach ($computer in $computers) {")
    
    scriptContents.AppendLine("If (Test-Connection -ComputerName $computer -Count 2 -Quiet -ErrorAction SilentlyContinue) {")
    scriptContents.AppendLine("    [PsCustomObject]@{Computer = $computer; Online = $true}")
    scriptContents.AppendLine("}")
    scriptContents.AppendLine("Else {")
    scriptContents.AppendLine("    [PsCustomObject]@{Computer = $computer; Online = $false}")
    scriptContents.AppendLine("}")
    scriptContents.AppendLine("}")
    
    Using ps As PowerShell = PowerShell.Create()
    
        ps.AddScript(scriptContents.ToString)
    
        Dim results1 As Collection(Of PSObject) = ps.Invoke()
    
    End Using