none
DHCPScope mit Where filtern - The argument is null or empty RRS feed

  • Frage

  • Hallo Kollegen,

    ich habe eine csv Datei mit folgendem Inhalt

    Scope
    ScopeNo1
    ScopeNo2

    Nun 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...

    Montag, 13. Mai 2019 10:31

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!

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

    Montag, 13. Mai 2019 16:50

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
    Montag, 13. Mai 2019 11:46
  • 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

    Montag, 13. Mai 2019 12:36
  • 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


    Montag, 13. Mai 2019 14:05
  • 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.

    Montag, 13. Mai 2019 14:47
  • 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
    Montag, 13. Mai 2019 14:49
  • 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.

    Montag, 13. Mai 2019 15:24
  • 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!

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

    Montag, 13. Mai 2019 16:50