2

I have this pipeline, which works in a PowerShell console:

Get-NetIPConfiguration | Where-Object { $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne 'Disconnected' }

However, when I attempt it in .NET using System.Management.Automation it fails with this exception:

System.Management.Automation.CommandNotFoundException
  HResult=0x80131501
  Message=The term 'Where-Object { $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne 'Disconnected' }' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
  Source=System.Management.Automation
  StackTrace:
   at System.Management.Automation.Runspaces.PipelineBase.Invoke(IEnumerable input)
   at System.Management.Automation.Runspaces.Pipeline.Invoke()
   at Duplexer.PowerShell.Engine.ExecutePipeline(PSCommand Command) in D:\Dev\Projects\Duplexer\Duplexer\Code\PowerShell\Engine.vb:line 80
   at Duplexer.Main.GetSettings() in D:\Dev\Projects\Duplexer\Duplexer\Main.vb:line 84
   at Duplexer.Tests.PowerShellTests.Can_Get_NIC_Settings() in D:\Dev\Projects\Duplexer\Duplexer.Tests\PowerShellTests.vb:line 6

Here's my .NET code:

Public Sub GetSettings()
  Dim oPipeline As PSCommand
  Dim oResult As Collection(Of PSObject)

  oPipeline = New PSCommand
  oPipeline.
    AddCommand(PowerShell.Commands.GetNetIPConfiguration).
    AddCommand(PowerShell.Commands.WhereObject & " { $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne 'Disconnected' }")

  Using oPowerShell As New PowerShell.Engine
    oPowerShell.ImportModules(PowerShell.Modules.NetAdapter, PowerShell.Modules.NetTCPIP)
    oResult = oPowerShell.ExecutePipeline(oPipeline)
  End Using
End Sub

How do I configure this PowerShell command for use in .NET Automation?

1 Answer 1

2

You need to provide the parameter argument (the scriptblock following Where-Object) separately. Change this line:

AddCommand(PowerShell.Commands.WhereObject & " { $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne 'Disconnected' }")

to:

AddCommand(PowerShell.Commands.WhereObject).
AddArgument(ScriptBlock.Create("$_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne 'Disconnected'"))
Sign up to request clarification or add additional context in comments.

2 Comments

Works perfectly, thank you. Are you aware of any official documentation on .NET PowerShell Automation? I looked, but apparently I wasn't looking in the right place.
Oops, never mind. I just found it: learn.microsoft.com/en-us/dotnet/api/…

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.