pixel0815
Goto Top

Wieso ist die Catch Ausgabe ohne ausgabe der Variable?

Hallo zusammen,

weshalb wird nicht die Variable $_.Hostname mit dem betreffenden nicht vorhandenen Record angezeigt?
Ich erhalte immer

Kein Host-Record vorhanden:
Da sollte eigentlich stehen

Kein Host-Record vorhanden: COMP123456
Der Write Host Befehl im Try block funktioniert.
Ne Idee?


Import-Csv c:\admin\test.csv | 

ForEach-Object {

    try {
    $ErrorActionPreference = 'Stop'  
    Get-DnsServerResourceRecord -Name $_.Hostname -ZoneName dom.loc

    } 
    catch {

      Write-Host "Kein Host-Record vorhanden: $_.Hostname"  
      }


}

Content-Key: 307702

Url: https://administrator.de/contentid/307702

Printed on: April 25, 2024 at 11:04 o'clock

Member: colinardo
colinardo Jun 20, 2016 updated at 10:57:44 (UTC)
Goto Top
Hallo pixel0815,

Immer wenn du auf Eigenschaften eines Objektes innerhalb von Anführungszeichen zugreifen willst musst du eine SubExpression verwenden, da sonst der Punkt hinter der Variablen etc. als normaler String interpretiert wird.
Ebenso wenn du Array-Objekte ansprichst wie $var diese musst du innerhalb eines Strings mit doppelten Anführungszeichen mit einer Subexpression klammern $($var), damit diese im String korrekt aufgelöst und nicht als String interpretiert werden!

Grüße Uwe
Member: emeriks
emeriks Jun 20, 2016 at 10:46:09 (UTC)
Goto Top
Hi,
könnte es sein, dass der Fehler in der letzten Zeile auftritt (nach dem letzten Cr+Lf) und diese Zeile leer ist und Du das nicht berücksichtigst?

E.
Member: pixel0815
pixel0815 Jun 20, 2016 updated at 10:52:08 (UTC)
Goto Top
Hallo colinardo,

ich hab es genau so gemacht und es bleibt trotzdem leer.
Der obige Befehl wird aber korrekt ausgeführt.
Gruß
Heiko

Import-Csv c:\admin\test.csv | 

ForEach-Object {

    try {
    $ErrorActionPreference = 'Stop'  
    Get-DnsServerResourceRecord -Name $_.Hostname -ZoneName dom.loc

    } 
    catch {

      Write-Host "Kein Host-Record vorhanden: $($_.Hostname)"  
      }


}
Member: colinardo
colinardo Jun 20, 2016 updated at 11:00:22 (UTC)
Goto Top
Sorry, das geht so nicht, da du mit dem $_ im catch auf das Exception Objekt zugreifst. Also speichere das Objekt vorher in einer extra Variablen.

Import-Csv c:\admin\test.csv | %{
    $host = $_.Hostname
    try {
       Get-DnsServerResourceRecord -Name $host -ZoneName dom.loc -EA Stop
    } 
    catch {
      Write-Host "Kein Host-Record vorhanden: $host"  
   }
}
Member: pixel0815
pixel0815 Jun 20, 2016 at 10:53:39 (UTC)
Goto Top
Hallo emeriks,

selbst wenn ich fantasienamen einsetze, und drauf achte das kein umbruch oder so vorhanden ist sehe ich die namen nicht in der fehlermeldung face-sad
Member: pixel0815
pixel0815 Jun 20, 2016 at 10:54:26 (UTC)
Goto Top
Wie schade colinardo face-sad
Member: colinardo
colinardo Jun 20, 2016 updated at 11:03:07 (UTC)
Goto Top
Wie schade colinardo
??? Ist doch kein Problem siehe mein Code oben !! Einfach als extra Variable speichern feddich ...
Member: colinardo
colinardo Jun 20, 2016 updated at 11:06:04 (UTC)
Goto Top
Im Catch-Teil. kannst du z.B. auch direkt auf die Exception zugreifen:
write-host "Fehler: $($_.Exception.Message)" -F Red  
Das ist der Grund warum du darin nicht auf dein Hostname über das $_ zugreifen kannst, weil dem Catch-Teil über das $_ das Exception Objekt übergeben wird.


Das ist an c# etc. angelehnt. Dort kannst du nämlich den Namen des Exception-Objekts explizit angeben:
catch (Exception e) { // Exception Body }
Member: pixel0815
pixel0815 Jun 20, 2016 at 11:05:54 (UTC)
Goto Top
Jawohl ja! Das klappt ja toll.
Wenn ich jetzt an das letzte } den Befehl | export-csv W:\keinhostrecord.csv -notypeinformation -delimiter ";" ranklemme, habe ich nur die Einträge drin die funktionieren. Wenn ich beim Catch Block das | export-csv W:\keinhostrecord.csv -notypeinformation -delimiter ";" ranklemme funktioniert das nicht. Ist das Absicht??


Import-Csv c:\admin\test.csv | %{
    $hostna = $_.Hostname
    try {
    $ErrorActionPreference = 'Stop'  
    Get-DnsServerResourceRecord -Name $hostna -ZoneName dom.loc
    } 
    catch {

      Write-Host "Kein Host-Record vorhanden: $hostna"  
      #write-host "Fehler: $($_.Exception.Message)" -F Red 
   }

} 
Member: colinardo
Solution colinardo Jun 20, 2016 updated at 11:30:41 (UTC)
Goto Top
funktioniert das nicht. Ist das Absicht??
Klar das geht natürlich nicht. Mach das mit einem [pscustomobject] und schreibe die Fehlerbehafteten in ein extra Objekt das du dann exportierst.

Da gibt es diverse Möglichkeiten.. hier mal zwei davon:

$data = (Import-Csv 'c:\admin\test.csv') | %{Add-Member $_ -MemberType NoteProperty -Name "Host-Record" -Value (Get-DnsServerResourceRecord -Name $_.Hostname -ZoneName dom.loc -EA Ignore) -Force -PassThru}  
$data | ?{$_.'Host-Record' -ne $null} | select -Expand 'Host-Record' | export-csv 'C:\success.csv' -Delimiter ";" -NoType -Encoding UTF8  
$data | ?{$_.'Host-Record' -eq $null} | select Hostname | export-csv 'C:\fail.csv' -Delimiter ";" -NoType -Encoding UTF8  
oder wenn du unbedingt bei deinem Konstrukt bleiben willst
Import-Csv 'c:\admin\test.csv' | %{  
    $hostna = $_.Hostname
    try {
        Get-DnsServerResourceRecord -Name $hostna -ZoneName dom.loc -EA Stop | export-csv 'C:\success.csv' -NoType -Encoding UTF8 -Append  
    } 
    catch {
        [pscustomobject]@{Hostname=$hostna;Status='Kein Resource-Record'} | export-csv 'C:\fail.csv' -NoType -Encoding UTF8 -Append  
    }
} 
Oder man macht es mit calculated properties und select, ach da gibt es so viele Wege nach Rom face-smile