none
Datum konvertieren (aus Abfrage mit Get-ADUser) RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine Frage betreffend Datum welches ich aus einer AD-Abfrage bekomme.

    Hier das Test-Script mit dem ich das konvertieren testen wollte:

    #16.01.2007 17:07
    
    Get-ADUser `
        -Filter {ObjectClass -like "user" -and name -like "*"} `
        -Properties `
            CN,Created,Modified,LastLogonDate |
    select `
            CN,Created,Modified,LastLogonDate |
    Export-Csv `
        -Delimiter ";" -NoTypeInformation -Path .\ADUser_test.csv
    . .\ADUser_test.csv

    Wenn ich das Script ausführe, bekomme ich als Datum "16.01.2007 17:07" zurück. Das CSV-File wird in einem weiteren Schritt in eine SQL-Tabelle eingelesen, die ich mit anderen Tabellen verknüpfe.

    Mein Problem ist das ich in SQL nicht nach dem Datum selecten oder sortieren kann da es als Text gesehen und damit quasi nach Tag sortiert.

    Ich hätte aber gerne das Datum im Format YYYY-MM-DD, die Uhrzeit ist erst mal Nebensache.

    Wie kann ich die abgefragten Properties schon beim abfüllen des CSV-Script verändern dass das benötigte Format dabei gespeichert wird?

    Viele Grüsse,
    Maximilian

    Mittwoch, 20. Januar 2016 13:45

Antworten

  • Hi,

    mein Vorschlag wäre folgender:

    $foo = Get-ADUser -Filter "objectclass -like 'user'" -Properties CN,Created,Modified,LastLogonDate | select CN,Created,Modified,LastLogonDate
    
    $foo | ForEach-Object {
    
    $_.Created = ($_.Created).ToString("yyyy-MM-dd")
    $_.Modified = ($_.Modified).ToString("yyyy-MM-dd")
    $_.LastLogonDate = ($_.LastLogonDate).ToString("yyyy-MM-dd")
    
    }
    
    $foo | Export-Csv -Delimiter ";" -NoTypeInformation -Path C:\test.csv

    Würde dir das so reichen?

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 20. Januar 2016 14:09
  • Hi,

    das kannst du abfangen indem du die Zeilen wie folgt abänderst:

    if ($_.Created -ne $null) {$_.Created = ($_.Created).ToString("yyyy-MM-dd")
    } else {$_.Created = "1990-01-01"}

    Die weiteren Zeilen dann analog. Anstelle vom 01.01.1990 kannst du natürlich einen anderen Wert setzen.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 21. Januar 2016 07:45
  • Hallo Maximilian,

    du müsstest vor jeder Konvertierung prüfen, ob der entsprechende Wert etwas enthält, d.h. nicht $null ist. Um dir etwas Schreibaufwand zu ersparen, kannst du auch den Namen der Eigenschaft in eine Variable legen und durch eine Schleife steuern.

    Das sähe dann so aus:

    foreach($f in $foo)
    {
        foreach($time in "Created","Modified","LastLogonDate")
        {
            if($f.$time -match "\d"){$f.$time = $f.$time.ToString("yyyy-MM-dd")}
            else{$f.$time = $null}
        }
    }

    Man könnte jetzt noch über die If-Bedingung streiten und "-ne $null" statt "-match "\d"" wählen. "-match "\d"" schaut einfach nach, ob das Feld eine Zahl enthält. Das ist robust, wenn (in einem anderen Kontext) auch leere Strings enthalten sein könnten.

    Viele Grüße

    Christoph


    Donnerstag, 21. Januar 2016 07:46

Alle Antworten

  • Hi,

    mein Vorschlag wäre folgender:

    $foo = Get-ADUser -Filter "objectclass -like 'user'" -Properties CN,Created,Modified,LastLogonDate | select CN,Created,Modified,LastLogonDate
    
    $foo | ForEach-Object {
    
    $_.Created = ($_.Created).ToString("yyyy-MM-dd")
    $_.Modified = ($_.Modified).ToString("yyyy-MM-dd")
    $_.LastLogonDate = ($_.LastLogonDate).ToString("yyyy-MM-dd")
    
    }
    
    $foo | Export-Csv -Delimiter ";" -NoTypeInformation -Path C:\test.csv

    Würde dir das so reichen?

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 20. Januar 2016 14:09
  • Hallo Christian,

    das könnte klappen, werde ich später testen sobald ich wieder am Firmen-Netz bin.

    Viele Grüsse,
    Maximilian

    Mittwoch, 20. Januar 2016 15:41
  • Hallo Christian,

    ich habe das Script getestet und soweit klappt es. Jetzt stürze ich aber darüber das manche Fehler offenbar NULL Werte beinhalten und dadurch der Fehler "You cannot call a method on a null-valued expression" auftritt.

    Gibt es eine elegante Möglichkeit diese noch abzufangen?Viele Grüsse,
    Maximilian

    Donnerstag, 21. Januar 2016 05:51
  • Hi,

    das kannst du abfangen indem du die Zeilen wie folgt abänderst:

    if ($_.Created -ne $null) {$_.Created = ($_.Created).ToString("yyyy-MM-dd")
    } else {$_.Created = "1990-01-01"}

    Die weiteren Zeilen dann analog. Anstelle vom 01.01.1990 kannst du natürlich einen anderen Wert setzen.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 21. Januar 2016 07:45
  • Hallo Maximilian,

    du müsstest vor jeder Konvertierung prüfen, ob der entsprechende Wert etwas enthält, d.h. nicht $null ist. Um dir etwas Schreibaufwand zu ersparen, kannst du auch den Namen der Eigenschaft in eine Variable legen und durch eine Schleife steuern.

    Das sähe dann so aus:

    foreach($f in $foo)
    {
        foreach($time in "Created","Modified","LastLogonDate")
        {
            if($f.$time -match "\d"){$f.$time = $f.$time.ToString("yyyy-MM-dd")}
            else{$f.$time = $null}
        }
    }

    Man könnte jetzt noch über die If-Bedingung streiten und "-ne $null" statt "-match "\d"" wählen. "-match "\d"" schaut einfach nach, ob das Feld eine Zahl enthält. Das ist robust, wenn (in einem anderen Kontext) auch leere Strings enthalten sein könnten.

    Viele Grüße

    Christoph


    Donnerstag, 21. Januar 2016 07:46