# Parameter und Optionen

> Was jede Option von Convert-DNSDebugLogFile tatsächlich ändert, wann du sie brauchst und welche Fallen leicht passieren können.

---

LLMS index: [llms.txt](/llms.txt)

---

Diese Seite erklärt die Optionen in einfacher Sprache und in der Reihenfolge, in der du sie typischerweise brauchst. Es ist ein Leitfaden, keine Spezifikation — die autoritative, immer aktuelle Parameterliste findest du in der [Befehlsreferenz](../commands/convert-dnsdebuglogfile/) und in:

```powershell
Get-Help Convert-DNSDebugLogFile -Full
```

## Die Kurzfassung

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log"
```

Diese eine Zeile liefert dir schon ein sinnvolles Verhalten: sowohl Daten- als auch Statistikdateien, Semikolon als Trennzeichen, das Datumsformat deiner Maschine, Header-Validierung an, Quell-Log bleibt unverändert. Alles Weitere ist Feintuning.

| Option | Standard | Ändere sie, wenn |
|---|---|---|
| `-InputFile` | *(erforderlich)* | immer |
| `-OutputFile` | Eingabepfad mit `.csv` | du die Ausgabe woanders haben willst |
| `-Delimiter` | `;` | dein Verbraucher Komma, Tab oder Pipe erwartet |
| `-ComputerName` | leer | du Logs von mehr als einem Server zusammenführst |
| `-OutputType` | `Both` | du nur Daten oder nur Rollups möchtest |
| `-ContextFilter` | `All` | du dich nur für den tatsächlichen DNS-Verkehr interessierst |
| `-InputCulture` | aktuelle Kultur | das Log von einem Server mit anderem Gebietsschema stammt |
| `-OutputCulture` | aktuelle Kultur | eine Maschine die CSV liest |
| `-NoDetailsParsing` | aus | Durchsatz wichtiger als Paketdetails ist |
| `-CompressOutput` | aus | du die Ergebnisse archivierst oder überträgst |
| `-RemoveSourceFile` | aus | geplante Aufräumaktion und du vertraust der Ausgabe |
| `-SkipHeaderValidation` | aus | die Datei gültig, aber der Header ungewöhnlich ist |

## Eingabe und Ausgabe

### -InputFile

Pfad zum zu konvertierenden Log. Akzeptiert ein Array und Pipeline-Eingaben — deshalb funktioniert das hier:

```powershell
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" | Convert-DNSDebugLogFile
```

`Get-ChildItem` gibt Objekte mit einer `FullName`-Eigenschaft aus, und `-InputFile` akzeptiert diese per Eigenschaftsname (Aliase sind u.a. `FullName`, `Path`, `FilePath`). Kein `ForEach-Object` nötig.

Lokale Pfade und SMB/UNC-Pfade funktionieren beide:

```powershell
Convert-DNSDebugLogFile -InputFile "\\dc01\C$\Administration\Logs\DNSServer\dns.log"
```

Der Befehl kann auch ein Log öffnen, das der DNS-Server gerade offen hält. Siehe [aktive Logs](#aktive-logs) weiter unten, bevor du dich darauf verlässt.

### -OutputFile

Ohne Angabe landet die CSV neben der Eingabedatei, gleicher Basisname, `.csv`-Erweiterung. Mit Angabe steuerst du das Ziel.

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">Es muss ein Dateipfad sein, kein Ordner</div>


`-OutputFile "D:\Processed\"` bedeutet nicht „in diesen Ordner schreiben“. Gib den vollständigen Pfad inklusive Dateiname an: `-OutputFile "D:\Processed\dns_data.csv"`.

Das heißt auch, dass `-OutputFile` bei vielen Dateien in der Pipeline keinen Sinn macht — jede Konvertierung würde in dieselbe Datei schreiben. Für Batchläufe lass es weg, damit jede Logdatei ihre eigene CSV erzeugt.
</div>


### -Delimiter

Standard ist ein Semikolon, weil in Gebieten, wo das Komma Dezimaltrennzeichen ist, Excel das erwartet. Nutze `-Delimiter ","` für Tools und Datenbanken, die klassische CSV mit Komma erwarten, oder `` -Delimiter "`t" `` für Tabulator.

Was auch immer du wählst, benutze *denselben* Wert beim Import. Eine Abweichung ist die Hauptursache dafür, dass „alles in einer Spalte landet“.

## Beschriftung und Filterung

### -ComputerName

Füllt die Spalte `ComputerName`. Die Spalte gibt es so oder so; das hier gibt ihr nur einen Wert.

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ComputerName $env:COMPUTERNAME
```

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">Das ist kein Remoting-Parameter</div>


Trotz des Namens (und der Aliase `-Server` / `-DNSServer` / `-HostName`) verbindet `-ComputerName` **nicht** mit irgendwas. Es gibt kein WinRM, keine Remote-Ausführung. Es schreibt nur ein Label in die Ausgabe. Um ein Remote-Log zu lesen, gib bei `-InputFile` einen UNC-Pfad an.
</div>


Setze es immer, wenn mehrere Server in einen Datensatz einspeisen — sonst kannst du später nicht mehr sagen, von welchem DC eine Zeile stammt.

### -OutputType

- `CSV` — nur die Datendatei
- `Statistic` — nur die zwei Aggregatdateien, keine Zeilendaten
- `Both` — alle drei Dateien *(Standard)*

`Statistic` ist die schnelle, kleine Option, wenn du nur tägliche Trends brauchst. `CSV` ist richtig, wenn ein nachgelagertes System selbst aggregiert.

### -ContextFilter

Ein DNS-Debug-Log mischt tatsächlichen Abfrageverkehr mit serverinternem Geplapper. `-ContextFilter` entscheidet, was in der Ausgabe bleibt.

```powershell
# nur echter DNS-Verkehr
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter Packet

# Verkehr plus Serverereignisse, aber keine Diagnosehinweise
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -ContextFilter Packet, Event
```

| Wert | Enthält |
|---|---|
| `All` | alles *(Standard)* |
| `Packet` | DNS-Anfragen und Antworten — die Daten, die die meisten Analysen brauchen |
| `Event` | Serverereignisse, z.B. „Der DNS-Server wurde gestartet“ |
| `Note` | Diagnosehinweise und Warnungen, z.B. Socket-Fehler |

Weitere Kontexttypen (`DSPoll`, `Init`, `Lookup`, `Recurse`, `Remote`, `Tombstone`) erscheinen unter `All`.

Filterst du nur auf `Event` oder `Note`, werden nur `DateTime`, `ThreadId`, `Context` und `Information` gefüllt — die Protokollspalten bleiben leer, weil diese Einträge diese Infos nicht enthalten.

`-ContextFilter Packet` ist die übliche Wahl für Sicherheits- und Reporting-Pipelines: es entfernt den Lärm und verkleinert die Ausgabe spürbar.

## Internationale Logs

Der DNS-Server schreibt Zeitstempel im Windows-Gebietsschema der Maschine, auf der er läuft. Ein deutscher DC schreibt `20.01.2026 23:00:16`; ein US-Server schreibt `1/20/2026 11:00:16 PM`. Wenn das Gebietsschema deines Arbeitsplatzrechners vom Server abweicht, klappt das Parsen nicht — oder schlimmer, Tag und Monat werden still vertauscht.

### -InputCulture

Sag dem Parser, welches Gebietsschema das *Quell-Log* verwendet:

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns-berlin.log" -InputCulture 'de-DE'
```

| Kultur | Log-Zeitstempelformat |
|---|---|
| `de-DE` | `TT.MM.JJJJ HH:MM:SS` |
| `en-US` | `M/T/JJJJ H:MM:SS AM/PM` |
| `en-GB` | `TT/MM/JJJJ HH:MM:SS` |
| `sv-SE` | `JJJJ-MM-TT HH:MM:SS` |

Standard ist die Kultur der Sitzung, die den Befehl ausführt. In einer Umgebung mit gemischten Gebietsschemata solltest du sie explizit setzen, statt dich auf den Standard zu verlassen — und denk daran, dass ein geplanter Task, der als `SYSTEM` läuft, vielleicht nicht die Kultur hat, mit der du interaktiv getestet hast.

### -OutputCulture

Steuert, wie Zeitstempel *in die CSV geschrieben* werden:

```powershell
# ISO-ähnliche Ausgabe, die SQL Server, Power BI und pandas alle verstehen
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'

# gleicher Effekt, explizite Invariant-Kultur
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" `
    -OutputCulture ([System.Globalization.CultureInfo]::InvariantCulture)
```

Faustregel: Wenn ein Mensch die Datei in Excel öffnet, nutze die lokale Kultur. Wenn eine Maschine sie liest, verwende `sv-SE` oder die Invariant-Kultur und mach dir keine Sorgen um regionale Einstellungen beim Import.

Die beiden Parameter sind unabhängig — du kannst ein schwedisches Log lesen und US-formatierten Output schreiben.

## Geschwindigkeit und Speicher

### -NoDetailsParsing

Wenn der DNS-Server volle Paketdetails protokolliert, wandelt der Parser jeden Detailblock in JSON in der Spalte `Details` um. Das ist nützlich, aber auch der teuerste Teil des Laufs und bläht die CSV auf.

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -NoDetailsParsing
```

Die Spalte bleibt vorhanden, aber leer; die TCP/UDP-Detail-Headerzeile ist weiterhin in `Information` verfügbar. Bei Logs mit vielen Detailblöcken kann das die Verarbeitungszeit um 30–50 % reduzieren. Nutze es, wenn Informationen auf Abfrageebene ausreichen.

### -CompressOutput

Komprimiert die erzeugten CSV-Dateien und löscht die unkomprimierten. `dns.log` erzeugt `dns.zip` statt `dns.csv`.

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput
```

CSV dieser Art komprimiert typischerweise um 90 % oder mehr, das spart also quasi kostenlosen Speicherplatz für Archive und beim Versand über das Netzwerk.

### -RemoveSourceFile

Löscht die Quell-`.log` nach erfolgreicher Konvertierung — die Logdatei wird nur gelöscht, wenn alle Ausgabedateien erstellt wurden.

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -CompressOutput -RemoveSourceFile
```

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">Löschen ist endgültig</div>


Es gibt hier keinen Papierkorb. Prüfe deine Ausgabe an echten Logs, bevor du das in einem geplanten Job aktivierst, und zeige niemals auf eine aktive Logdatei.

Der Befehl verweigert absichtlich die Kombination von `-RemoveSourceFile` mit `-SkipHeaderValidation`, damit du keine Datei löschen kannst, die nie als DNS-Log bestätigt wurde.
</div>


## Sicherheitsnetze

### -SkipHeaderValidation

Standardmäßig prüft der Befehl, ob die Datei wirklich ein DNS-Server-Debug-Log ist, bevor er es parst. Das fängt den klassischen Fehler ab, den Job auf den falschen Ordner zu zeigen.

Schalte es nur bei wirklich ungewöhnlichen Fällen aus: handbearbeitete Logs, vorgefilterte Ausschnitte, benutzerdefinierte Formate. Lass es sonst an — es kostet kaum Leistung und verhindert, dass ein Tippfehler in einem Haufen Müll endet.

### -WhatIf und -Confirm

Der Befehl unterstützt beides. `-WhatIf` ist der richtige Weg, um zu sehen, was ein neuer Batch-Job anfasst:

```powershell
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
    Convert-DNSDebugLogFile -RemoveSourceFile -WhatIf
```

`-Confirm` fragt vor der Verarbeitung jeder Datei, vor dem Löschen einer Quelldatei und vor dem Überschreiben vorhandener Ausgaben nach.

## Aktive Logs

`Convert-DNSDebugLogFile` kann eine Datei lesen, die der DNS-Server gerade offen hat. Praktisch für einen Ad-hoc-Blick auf das, was gerade passiert.

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">Nicht für geplante oder produktive Läufe</div>


Ein aktives Log ändert sich während des Lesens. Die Ausgabe kann Einträge vermissen, die während der Konvertierung geschrieben wurden, und der letzte Datensatz kann abgeschnitten sein. Ein erneuter Lauf liefert ein anderes Ergebnis.

Für reproduzierbare Ausgaben aktiviere das Log-Rollover auf dem DNS-Server und konvertiere nur geschlossene, rotierte Dateien — zum Beispiel indem du die neueste überspringst:

```powershell
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
    Sort-Object LastWriteTime -Descending |
    Select-Object -Skip 1 |
    Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
```
</div>


## Zusammengesetzt

Ein typischer Produktionsaufruf auf einem Domänencontroller:

```powershell
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
    Sort-Object LastWriteTime -Descending |
    Select-Object -Skip 1 |
    Convert-DNSDebugLogFile `
        -ComputerName $env:COMPUTERNAME `
        -Delimiter ';' `
        -OutputType Both `
        -ContextFilter Packet `
        -OutputCulture 'sv-SE' `
        -CompressOutput
```

Gelesen heißt das: Nimm jedes rotierte Log außer dem aktiven, behalte nur DNS-Verkehr, versehe jede Zeile mit dem Servernamen, schreibe maschinenlesbare Zeitstempel und hinterlasse komprimierte Archive. Die vollständige Version für geplante Tasks und Gruppenrichtlinien findest du im [GPO-gesteuerten Sammelbeispiel](../examples/gpo-driven-collection/).
