Benutzer mit den meisten Antworten
Argumentlist funktioniert nicht mit Invoke-Command und Where-Object

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
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''
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''
-
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
-
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