Benutzer mit den meisten Antworten
DHCPScope mit Where filtern - The argument is null or empty

Frage
-
Hallo Kollegen,
ich habe eine csv Datei mit folgendem Inhalt
Scope
ScopeNo1
ScopeNo2Nun würde ich gerne diese Liste hernehmen, um auf die in der Liste aufgeführten DHCP Scopes entsprechende Optionen zu setzen, wie DNS Server.
Dazu habe ich mir folgenden Code gebaut:#Gemeinsame Liste Computer, Benutzer, DHCP Scopes $DHCPScopeListe = import-csv -Path C:\temp\DHCPScopeListe.csv -Delimiter ";" Schleife durch durchgehen der CSV zum Import der DHCP Einstellungen foreach ($DHCPScopeEntry in $DHCPScopeListe) { #Einzelne Scopes durchgehen echo "DHCPScope: " $DHCPScopeEntry.Scope #Scope holen $dhcpscope = Get-DhcpServerv4Scope -ComputerName $DHCPServer | ? {$_.name -like $DHCPScopeEntry.Scope} echo "dhcpscope: "$dhcpscope .... Set-DhcpServerv4OptionValue -computername $DHCPServer -scopeid $dhcpscope.ScopeId -OptionId 006 -Value $DNSServerRV1,$DNSServerRV2 -WhatIf
VOR der Übergabe an "set-dhcpserverv4..." lasse ich mir die neu befüllte Variable "$dhcpsope" ausgeben, diese ist hier bereits leer - doof.
Das Holen der DHCP Scopes an sich funktioniert, lasse ich die Where-Clause weg, erhalte ich die Liste.
Füge ich in die Where-Clause anstatt dem Variablen-Property "$DHCPScopeEntry.Scope" einen String ein, der dem Namen eines in der Liste enthaltenen Scope entspricht, funktioniert das Filtern auch.Irgendwie stehe ich auch dem Schlauch und freue mich, wenn Ihr mich hier auf den richtigen Weg bringt...
Antworten
-
So, viel Zeit für Dinge ins Land gegangen, eine richtige Erklärung dafür habe ich nicht, hier die Code, der nun funktioniert:
$DHCPServer = "dhcpserver" $DNSServer1 = 192.168.1.1 $DNSServer2 = 192.168.1.2 $dhcpscope = $null $DHCPScopeListe = import-csv -Path C:\temp\DHCPScopeListe.csv -Delimiter ";" foreach ($DHCPScopeEntry in $DHCPScopeListe) { Write-Host "DHCPScope in Liste: $($DHCPScopeEntry.Scope)'" $dhcpscope = Get-DhcpServerv4Scope -ComputerName $DHCPServer | Where-Object { $_.Name -like $DHCPScopeEntry.Scope } Write-Host "DHCPScope Name im DHCP: $($dhcpscope.Name)" Write-Host "DHCPScope ID im DHCP: $($dhcpscope.ScopeID)" echo "-------------" if ($dhcpscope) { #DNS setzen Set-DhcpServerv4OptionValue -ComputerName $DHCPServer -ScopeId $dhcpscope.ScopeId -OptionId 006 -Value $DNSServer1,$DNServer2 -WhatIf #Scope replizieren Invoke-DhcpServerv4FailoverReplication -ComputerName $DHCPServer -ScopeId $dhcpscope.ScopeId -Force -WhatIf } }
Ausser schöner formatiert sehe ich technisch keinen Unterschied zu meinem Eingangsscript bei der Behandlung der Strings und Übergaben an die cmdlets.
Wäre es zu vermessen, es als #Bug zu definieren?
Danke an alle, die hier fleissig mitgeholfen und Zeit investiert haben!
- Als Antwort markiert oneworld-oneandrew Montag, 13. Mai 2019 15:56
-
eine richtige Erklärung dafür habe ich nicht,
wenn Du bei dem Code und der dazugehörigen Ausgabe Deiner zweiten Antwort nicht ein zusätzliches Leerzeichen eingefügt hast, ist das der Fehler. Mit einem zusätzlichen Leerzeichen am Ende der Zeichenkette, kann der Vergleich niemals einen Treffer liefern. In einer standardkonformen CSV-Datei wären Zeichenketten in doppelte Anführungszeichen eingeschlossen und Du hättest den Fehler vielleicht schon eher erkannt. Ein CSV mit nur einer Spalte find ich sowieso immer ulkig - da macht's dann auch eine einfache Text-Datei.
Ausser schöner formatiert sehe ich technisch keinen Unterschied zu meinem Eingangsscript bei der Behandlung der Strings und Übergaben an die cmdlets.
Wie schon gesagt - Leerzeichen. Bei der Arbeit mit Strings, die im Zweifel vielleicht sogar "von Hand" erstellt wurden, oder aus einer nicht hundertprozentig zuverlässigen Quelle stammen, empfiehlt es sich immer, die korrekte Formatierung zu prüfen - wozu dann auch führende und folgende Leerzeichen gehören würden.
Wäre es zu vermessen, es als #Bug zu definieren?
... mit ziemlich hoher Wahrscheinlichkeit - Ja - es wäre vermessen. ;-)
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 14. Mai 2019 01:58
Alle Antworten
-
$DHCPServer ausserhalb des von Dir hier geposteten Codes deklariert wird ...
$DHCPScopeListe = import-csv -Path C:\temp\DHCPScopeListe.csv -Delimiter ";" foreach ($DHCPScopeEntry in $DHCPScopeListe) { Write-Host "DHCPScope: '$($DHCPScopeEntry.Scope)'" $dhcpscope = Get-DhcpServerv4Scope -ComputerName $DHCPServer | Where-Object { $_.name -like "$($DHCPScopeEntry.Scope)*" } Write-Host "dhcpscope: '$($dhcpscope)'" Set-DhcpServerv4OptionValue -ComputerName $DHCPServer -ScopeId $dhcpscope.ScopeId -OptionId 006 -Value $DNSServerRV1, $DNSServerRV2 -WhatIf }
Wenn Du Dir mit den Scopes in Deiner CSV-Liste sicher bist, kannst Du auch statt -like -eq benutzen und das Sternchen weglassen.
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Montag, 13. Mai 2019 11:49
-
Hi Olaf,
danke für die schnelle Rückmeldung.
Leider habe ich mit Deinem Code das gleiche Problem - nach dem Anwenden der Where-Klausel ist meine befüllte Variable "$dhcpscope" leer - dann schlägt auch das set-dhcpserverv4optionvalue-cmndlet fehl.Code: $DHCPServer = "dhcpserver01" $DNSServerRV1 = 192.168.1.1 $DHCPScopeListe = import-csv -Path C:\temp\DHCPScopeListe.csv -Delimiter ";" foreach ($DHCPScopeEntry in $DHCPScopeListe) { Write-Host "DHCPScope in Liste: '$($DHCPScopeEntry.Scope)'" $dhcpscope = Get-DhcpServerv4Scope -ComputerName $DHCPServer | Where-Object { $_.name -eq "$($DHCPScopeEntry.Scope)" } Write-Host "dhcpscope im DHCP: '$($dhcpscope)'" Set-DhcpServerv4OptionValue -ComputerName $DHCPServer -ScopeId $dhcpscope.ScopeId -OptionId 006 -Value $DNSServerRV1 -WhatIf } Ausgabe: DHCPScope in Liste: 'ScopeNo1 ' dhcpscope im DHCP: '' Set-DhcpServerv4OptionValue : Cannot validate argument on parameter 'ScopeId'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. At C:\temp\Test.ps1:11 char:68 + ... onValue -ComputerName $DHCPServer -ScopeId $dhcpscope.ScopeId -Option ... + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Set-DhcpServerv4OptionValue], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Set-DhcpServerv4OptionValue
-
hi
hast Du in dem Output gesehen das bereits
Write-Host "dhcpscope im DHCP: '$($dhcpscope)'"
schon nix mehr ausgibt ?
was ist wenn Du das "Objekt" prüfst
mit
if ($dhcpscope)
{deine Funktion}
in der Zeile Write-Host "dhcpscope im DHCP: '$($dhcpscope)'"
kannst Du die beiden ' weglassen.
Klaus
- Bearbeitet Klaus Bilger Montag, 13. Mai 2019 14:06
-
Hi Klaus,
> hast Du in dem Output gesehen das bereits Write-Host "dhcpscope im DHCP: '$($dhcpscope)'" schon nix mehr ausgibt ?
Hab ich gesehen, dass ist ja mein eigentliches Problem.
Sobald ich das "where-object" mit der Variable "$DHCPScopeEntry.Scope" anwende als Filter, habe ich keine Ausgabe mehr in der "$dhdcpscope".Nehme ich anstatt der "$DHCPScopeEntry.Scope" einen String als Vergleich in Where-Ausdruck, welcher so in der csv vorhanden ist, läuft der Code auch.
Das dynamische Verwenden der Variable "$DHCPScopeEntry.Scope" macht mir hier also (grad nicht greifbare Probleme.Die "If" Klausel ist hilfreich, wenn da tatsächlich nichts richtiges zu verarbeiten ist, dass habe ich jedoch hier nicht, die csv ist glatt gezogen.
Merk ich mir jedoch, ganz hilfeich-danke. -
Vielleicht postest Du mal 1 oder 2 Zeilen Deiner CSV-Datei (natürlich um sensible Inforamtionen bereinigt und als Code formattiert bitte). Hat Deine CSV-Datei Leerzeilen?
Wenn ich mich nicht vergucke, hast Du Leerzeichen in Deiner CSV-Datei. In Deinem "Code-Output" steht hinter 'ScopeNr1 ' und dem schließenden einfachen Anführungszeichen ein Leerzeichen. Vielleicht solltest Du den Input der CSV-Datei "Trimmen"
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Bearbeitet BOfH-666 Montag, 13. Mai 2019 14:55
-
OK; hier mal die CSV im Auszug, Leerzeichen-bereinigt:
Scope ScopeNo1 ScopeNo2
Aktuelle Ausgabe des Scripts:
DHCPScope in Liste: ScopeNo1' DHCPScope in DHCP: DhcpServerv4Scope ------------- What if: Following values will be set for option 6 for Scope 192.168.2.0 on server dhpserver: 0.0.0.0. DHCPScope in Liste: ScopeNo2' DHCPScope in DHCP: DhcpServerv4Scope ------------- What if: Following values will be set for option 6 for Scope 192.168.3.0 on server dhcpserver: 0.0.0.0.
Woher der String "DHCPServerv4Scope" nun kommt...Sieht aus, wie der 2.te Teil des cmd-lets "get-dhcpserverv4scope" im Script, wie wenn Powershell das cmdlet als String interpretiert.
In einer manuellen Ausgabe des cmdlets mit allen möglichen Optionen sehe ich nirgends diesen String, als Ausgabe kann er also auch nicht kommen.Zur Info: Ps 5.1 unter Server 2016.
-
So, viel Zeit für Dinge ins Land gegangen, eine richtige Erklärung dafür habe ich nicht, hier die Code, der nun funktioniert:
$DHCPServer = "dhcpserver" $DNSServer1 = 192.168.1.1 $DNSServer2 = 192.168.1.2 $dhcpscope = $null $DHCPScopeListe = import-csv -Path C:\temp\DHCPScopeListe.csv -Delimiter ";" foreach ($DHCPScopeEntry in $DHCPScopeListe) { Write-Host "DHCPScope in Liste: $($DHCPScopeEntry.Scope)'" $dhcpscope = Get-DhcpServerv4Scope -ComputerName $DHCPServer | Where-Object { $_.Name -like $DHCPScopeEntry.Scope } Write-Host "DHCPScope Name im DHCP: $($dhcpscope.Name)" Write-Host "DHCPScope ID im DHCP: $($dhcpscope.ScopeID)" echo "-------------" if ($dhcpscope) { #DNS setzen Set-DhcpServerv4OptionValue -ComputerName $DHCPServer -ScopeId $dhcpscope.ScopeId -OptionId 006 -Value $DNSServer1,$DNServer2 -WhatIf #Scope replizieren Invoke-DhcpServerv4FailoverReplication -ComputerName $DHCPServer -ScopeId $dhcpscope.ScopeId -Force -WhatIf } }
Ausser schöner formatiert sehe ich technisch keinen Unterschied zu meinem Eingangsscript bei der Behandlung der Strings und Übergaben an die cmdlets.
Wäre es zu vermessen, es als #Bug zu definieren?
Danke an alle, die hier fleissig mitgeholfen und Zeit investiert haben!
- Als Antwort markiert oneworld-oneandrew Montag, 13. Mai 2019 15:56
-
eine richtige Erklärung dafür habe ich nicht,
wenn Du bei dem Code und der dazugehörigen Ausgabe Deiner zweiten Antwort nicht ein zusätzliches Leerzeichen eingefügt hast, ist das der Fehler. Mit einem zusätzlichen Leerzeichen am Ende der Zeichenkette, kann der Vergleich niemals einen Treffer liefern. In einer standardkonformen CSV-Datei wären Zeichenketten in doppelte Anführungszeichen eingeschlossen und Du hättest den Fehler vielleicht schon eher erkannt. Ein CSV mit nur einer Spalte find ich sowieso immer ulkig - da macht's dann auch eine einfache Text-Datei.
Ausser schöner formatiert sehe ich technisch keinen Unterschied zu meinem Eingangsscript bei der Behandlung der Strings und Übergaben an die cmdlets.
Wie schon gesagt - Leerzeichen. Bei der Arbeit mit Strings, die im Zweifel vielleicht sogar "von Hand" erstellt wurden, oder aus einer nicht hundertprozentig zuverlässigen Quelle stammen, empfiehlt es sich immer, die korrekte Formatierung zu prüfen - wozu dann auch führende und folgende Leerzeichen gehören würden.
Wäre es zu vermessen, es als #Bug zu definieren?
... mit ziemlich hoher Wahrscheinlichkeit - Ja - es wäre vermessen. ;-)
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 14. Mai 2019 01:58