none
Argumentlist funktioniert nicht mit Invoke-Command und Where-Object RRS feed

  • Frage

  • Liebe Mitleser,

    Ich versuche, Firewallregeln eines Servers mit Invoke-Command auszulesen und dabei auf den Namen der Regel zu filtern. Solange ich den Filterwert hart in das Where-Object Statement schreiben, erhalte ich die erwarteten Regeln. Sobald ich aber den Wert als Argument übergebe, kommt nichts mehr zurück. Dabei habe ich alle möglichen Varianten für $args versucht. Alles außer Variante 3 mit $($args[0]) ist dabei pure Verzweiflung ;-)

    Invoke-Command -ComputerName SERVER -ScriptBlock { Get-NetFirewallRule | Where-Object { $_.DisplayName -like "2018*" } } -ArgumentList "2018*" | fl DisplayName
    DisplayName : 2018-01-16 00:00:00
    DisplayName : 2018-01-16 00:00:01
    DisplayName : 2018-01-17 19:49:36
    DisplayName : 2018-01-17 19:52:02


    Invoke-Command -ComputerName SERVER -ScriptBlock { Get-NetFirewallRule | Where-Object { $_.DisplayName -like "$args" } } -ArgumentList "2018*" | fl DisplayName

    Invoke-Command -ComputerName SERVER -ScriptBlock { Get-NetFirewallRule | Where-Object { $_.DisplayName -like "$args[0]" } } -ArgumentList "2018*" | fl DisplayName

    Invoke-Command -ComputerName SERVER -ScriptBlock { Get-NetFirewallRule | Where-Object { $_.DisplayName -like "$($args[0])" } } -ArgumentList "2018*" | fl DisplayName

    Invoke-Command -ComputerName SERVER -ScriptBlock { Get-NetFirewallRule | Where-Object { $_.DisplayName -like $($args[0]) } } -ArgumentList "2018*" | fl DisplayName

    Invoke-Command -ComputerName SERVER -ScriptBlock { Get-NetFirewallRule | Where-Object { $_.DisplayName -like $args[0] } } -ArgumentList "2018*" | fl DisplayName

    Invoke-Command -ComputerName SERVER -ScriptBlock { Get-NetFirewallRule | Where-Object { $_.DisplayName -like $args } } -ArgumentList "2018*" | fl DisplayName

    Was mache ich falsch?

    Beste Grüße
    MPIDR

    Mittwoch, 17. Januar 2018 20:26

Antworten

  • Hmmm ... eigentlich sollte Variante 5 ja ganz normal funktionieren, aber wenn es mit Variante 3 auch klappt, wo ist dann das Problem?  ;-)

    Übrigens: wenn Du zum Code posten, die entsprechende Formatierungs-Option in der Symbolleiste benutzt, dann ist der Code leichter zu lesen, zu kopieren und auch zu verstehen. Ungewollte Zeilenumbrüche werden damit vermieden.

    Du kannst in einem Scriptblock auch "externe" Variablen verwenden, indem Du mit "$using" den Variablen-Scope auf den Scriptblock erweiterst. Sollte so klappen:

    $pattern = '2018*'
    Invoke-Command -ComputerName SERVER -ScriptBlock {
        Get-NetFirewallRule |
            Where-Object { $_.DisplayName -like $using:pattern }
    } |
        Format-List DisplayName

    Edit: Mit dem Parameter -CimSession kannst Du das Ganze Scriptblock-Geraffel übrigens ganz umgehen. Sollte dann also so funktionieren:

    $ComputerName = 'Serverwasauchimmer'
    $WMIData = New-CimSession -CN $ComputerName
    Get-NetFirewallRule -CimSession $WMIData -DisplayName '2018*'
    
    Der DisplayName muss dann aber auch mit '2018' anfangen ... klar, oder?  ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Donnerstag, 18. Januar 2018 00:47
    • Als Antwort markiert MPIDR Donnerstag, 18. Januar 2018 15:00
    Donnerstag, 18. Januar 2018 00:34

Alle Antworten

  • Hmmm ... eigentlich sollte Variante 5 ja ganz normal funktionieren, aber wenn es mit Variante 3 auch klappt, wo ist dann das Problem?  ;-)

    Übrigens: wenn Du zum Code posten, die entsprechende Formatierungs-Option in der Symbolleiste benutzt, dann ist der Code leichter zu lesen, zu kopieren und auch zu verstehen. Ungewollte Zeilenumbrüche werden damit vermieden.

    Du kannst in einem Scriptblock auch "externe" Variablen verwenden, indem Du mit "$using" den Variablen-Scope auf den Scriptblock erweiterst. Sollte so klappen:

    $pattern = '2018*'
    Invoke-Command -ComputerName SERVER -ScriptBlock {
        Get-NetFirewallRule |
            Where-Object { $_.DisplayName -like $using:pattern }
    } |
        Format-List DisplayName

    Edit: Mit dem Parameter -CimSession kannst Du das Ganze Scriptblock-Geraffel übrigens ganz umgehen. Sollte dann also so funktionieren:

    $ComputerName = 'Serverwasauchimmer'
    $WMIData = New-CimSession -CN $ComputerName
    Get-NetFirewallRule -CimSession $WMIData -DisplayName '2018*'
    
    Der DisplayName muss dann aber auch mit '2018' anfangen ... klar, oder?  ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Donnerstag, 18. Januar 2018 00:47
    • Als Antwort markiert MPIDR Donnerstag, 18. Januar 2018 15:00
    Donnerstag, 18. Januar 2018 00:34
  • Hi,

    du kannst anstelle von ARGS auch mit PARAM arbeiten, in etwa so:

    Invoke-Command -ComputerName SERVER -ArgumentList "2018*" -ScriptBlock {
    	param (
            $SearchString
        )
    	Get-NetFirewallRule | Where-Object {$_.DisplayName -like $SearchString}
    } | Format-List DisplayName
    Beste Gruesse
    brima


    • Bearbeitet brima Donnerstag, 18. Januar 2018 09:21
    Donnerstag, 18. Januar 2018 09:20
  • Hmmm ... eigentlich sollte Variante 5 ja ganz normal funktionieren, aber wenn es mit Variante 3 auch klappt, wo ist dann das Problem?  ;-)

    Es funktioniert keine Variante, d.h. Nr. 3 auch nicht.

    Der Tipp mit $using war aber sehr hilfreich. Damit erhalte ich das gewünschte Ergebnis. Vielen Dank!

    Beste Grüße
    MPIDR

    Donnerstag, 18. Januar 2018 15:00