# Convert-DNSDebugLogFile

LLMS index: [llms.txt](/v1.0.0.0/llms.txt)

---

## SYNOPSIS

将 Windows DNS 服务器调试日志文件转换为 CSV 格式。

## SYNTAX

### __AllParameterSets

```
Convert-DNSDebugLogFile [-InputFile] <string[]> [[-OutputFile] <string>] [[-Delimiter] <string>]
 [[-ComputerName] <string>] [[-OutputType] <string>] [[-InputCulture] <cultureinfo>]
 [[-OutputCulture] <cultureinfo>] [-SkipHeaderValidation] [-RemoveSourceFile] [-CompressOutput]
 [-WhatIf] [-Confirm] [<CommonParameters>]
```

## ALIASES

此 cmdlet 有以下别名，

## DESCRIPTION

高性能的 Windows DNS 服务器调试日志文件解析器，旨在使 DNS 服务器活动透明化、可分析，并可在报告和分析工具中评估。

DNS 服务器调试日志包含详细的查询/响应信息，但原始文本格式难以分析。  
此脚本将这些日志转换为结构化的 CSV 文件，便于导入 Excel、Power BI、SQL 数据库或其他数据分析平台。

主要功能：  
- 解析 DNS 调试日志中的所有 16 个字段（日期、时间、协议、客户端 IP、查询类型等）  
- 生成结构化 CSV 输出，分隔符可自定义  
- 可选生成按客户端、协议和查询类型汇总的统计摘要  
- 支持单个文件或通过管道批量处理  
- 支持标准和详细的 DNS 调试日志格式  
- 可选自动压缩输出文件以节省磁盘空间  
- 可选成功处理后删除源文件  
- 验证日志文件头以确保数据完整性

使用场景：  
- 安全分析：识别可疑的 DNS 查询模式  
- 性能监控：跟踪查询量和响应时间  
- 容量规划：分析 DNS 服务器负载和客户端分布  
- 合规报告：记录 DNS 活动以满足审计要求  
- 故障排查：调查 DNS 解析问题

性能优化：  
针对大文件（100MB+）优化，使用：  
- 字符串操作替代正则表达式解析  
- 使用 64KB 缓冲区的 StreamReader/StreamWriter  
- 手动生成 CSV，避免 Export-Csv 的开销  
- 高效的基于字典的统计收集

兼容性：  
- Windows 上的 PowerShell 5.1+  
- Windows 上的 PowerShell 7+  
- Windows Server 2016 及以后版本  
- 支持 DNS Server 2012 R2 到 2025 的调试日志格式

## EXAMPLES

### EXAMPLE 1

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log"
```

使用默认设置将 DNS 调试日志转换为 CSV 格式。  
输出：C:\Logs\dns.csv（仅数据文件，分号分隔符）。

### EXAMPLE 2

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputType Both
```

转换 DNS 调试日志并生成两个输出文件。  
输出：C:\Logs\dns.csv（数据）和 C:\Logs\dns_statistic.csv（汇总统计）。

### EXAMPLE 3

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputType Statistic
```

仅生成统计文件，不创建完整的 CSV 数据文件。  
输出：C:\Logs\dns_statistic.csv（仅统计）。

### EXAMPLE 4

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputFile "C:\Output\parsed.csv"
```

将 DNS 调试日志转换到自定义输出位置。  
输出：C:\Output\parsed.csv。

### EXAMPLE 5

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -Delimiter "," -ComputerName "DNS01" -OutputType Both
```

使用逗号分隔符并添加 ComputerName 列转换日志。  
输出：C:\Logs\dns.csv 和 C:\Logs\dns_statistic.csv，ComputerName 列均为 "DNS01"。

### EXAMPLE 6

```powershell
PS C:\> Get-ChildItem "C:\Logs\*.log" | .\Convert-DnsDebugLogFile.ps1 -OutputType Both
```

通过管道处理多个 DNS 调试日志文件。  
输出：每个 .log 文件生成对应的 .csv（数据）和 _statistic.csv（统计）文件。

### EXAMPLE 7

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -CompressOutput
```

转换 DNS 调试日志并将输出压缩为 ZIP 文件。  
输出：C:\Logs\dns.zip，包含 dns.csv。压缩后删除未压缩的 csv 文件。

### EXAMPLE 8

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputType Both -CompressOutput
```

转换日志并生成统计数据，同时压缩两个输出文件。  
输出：C:\Logs\dns.zip，包含 dns.csv 和 dns_statistic.csv。

### EXAMPLE 9

```powershell
PS C:\> Get-ChildItem "C:\Logs\*.log" | .\Convert-DnsDebugLogFile.ps1 -RemoveSourceFile -CompressOutput
```

处理多个日志文件，压缩输出并删除源文件。  
每个 .log 文件转换为压缩的 .zip 文件，然后删除源 .log 文件。  
适合自动化日志归档流程。

### EXAMPLE 10

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\old_dns.log" -RemoveSourceFile -Verbose
```

转换日志文件并在成功处理后删除源文件。  
详细输出确认文件已删除。使用时请谨慎，因为源文件会被永久删除。

### EXAMPLE 11

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE'
```

转换来自德国 Windows 服务器的 DNS 调试日志。  
当日志文件来自不同区域设置的服务器时使用。

### EXAMPLE 12

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -InputCulture ([System.Globalization.CultureInfo]::GetCultureInfo('sv-SE'))
```

转换来自瑞典 Windows 服务器、使用 ISO 日期格式（YYYY-MM-DD）的 DNS 调试日志。  
适用于处理不同区域设置服务器的日志。

### EXAMPLE 13

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE' -OutputCulture 'en-US'
```

转换来自德国 Windows 服务器的 DNS 调试日志，并将输出日期格式化为美国系统格式。  
适用于国际服务器日志供美国系统使用。

### EXAMPLE 14

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputCulture ([System.Globalization.CultureInfo]::InvariantCulture)
```

转换 DNS 调试日志，输出日期使用 ISO 8601 格式（YYYY-MM-DD）。  
适合跨平台兼容或数据交换场景。

### EXAMPLE 15

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -WhatIf
```

显示如果运行命令会发生什么，但不实际创建任何文件。  
适合在处理实际数据前测试命令参数。

### EXAMPLE 16

```powershell
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -RemoveSourceFile -CompressOutput -WhatIf
```

预览完整工作流程，包括压缩和源文件删除。  
不创建、压缩或删除任何文件，仅显示将会发生的操作。

## PARAMETERS

### -CompressOutput

在创建后将输出的 CSV 文件压缩为 ZIP 文件。

创建一个包含生成的 CSV 文件的 .zip 文件，然后删除未压缩的 CSV 文件。  
ZIP 文件与输出 CSV 文件位于同一目录，且使用相同的基本名称。  
压缩在每个文件处理完后立即进行，以有效管理磁盘空间。

优点：  
- 大幅减少磁盘空间占用（CSV 文件压缩效果很好）  
- 简化文件管理和归档  
- 适合长期存储处理过的日志

示例：输入 'dns.log' 生成 'dns.csv'，随后压缩为 'dns.zip'，然后删除 'dns.csv'。

兼容 PowerShell 5.1+ 和 Windows Server 2016+。

```yaml
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -ComputerName

可选。  
如果指定，将在 CSV 输出中添加一个 ComputerName 列，值为指定内容。  
适用于合并多个 DNS 服务器日志时标识来源。

重要提示：这不是远程功能。  
脚本仅处理本地文件。

```yaml
Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Server
- DNSServer
- HostName
ParameterSets:
- Name: (All)
  Position: 3
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -Confirm

在运行 cmdlet 前提示确认。

指定后，在以下操作前提示确认：  
- 处理每个 DNS 调试日志文件  
- 删除源文件（当指定 -RemoveSourceFile 时）  
- 覆盖已有输出文件

适合交互式处理时控制处理文件。

```yaml
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- cf
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -Delimiter

CSV 输出的分隔符字符。

默认是分号 ';'

```yaml
Type: String
DefaultValue: ;
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 2
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -InputCulture

指定用于解析 DNS 调试日志中日期/时间值的区域文化。

DNS 服务器调试日志使用生成日志的服务器 Windows 区域设置的日期格式。  
此参数允许解析来自不同区域设置服务器的日志。

默认是当前文化 ([System.Globalization.CultureInfo]::CurrentCulture)。

常见文化值：  
- 'de-DE' 或 'de-AT'：德语格式（DD.MM.YYYY 或 DD/MM/YYYY）  
- 'en-US'：美国格式（MM/DD/YYYY）  
- 'en-GB'：英国格式（DD/MM/YYYY）  
- 'sv-SE'：瑞典/ISO 格式（YYYY-MM-DD）

示例：-InputCulture 'de-DE' 用于德国 Windows 服务器的日志。  
示例：-InputCulture ([System.Globalization.CultureInfo]::GetCultureInfo('sv-SE')) 用于瑞典日志。

```yaml
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 5
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -InputFile

要解析的 DNS 调试日志文件路径。  
支持数组以处理多个文件。

```yaml
Type: String[]
DefaultValue: ''
SupportsWildcards: false
Aliases:
- FullName
- FilePath
- InputPath
- File
- Path
ParameterSets:
- Name: (All)
  Position: 0
  IsRequired: true
  ValueFromPipeline: true
  ValueFromPipelineByPropertyName: true
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -OutputCulture

指定用于格式化输出 CSV 文件中日期/时间值的区域文化。

此参数控制 DateTime 值写入 CSV 输出的格式。  
当 CSV 文件将被特定区域设置的应用程序或系统使用时非常有用。

默认是当前文化 ([System.Globalization.CultureInfo]::CurrentCulture)。

常见文化值：  
- 'en-US'：美国格式（MM/DD/YYYY）  
- 'de-DE'：德语格式（DD.MM.YYYY）  
- 'en-GB'：英国格式（DD/MM/YYYY）  
- 'sv-SE'：瑞典/ISO 格式（YYYY-MM-DD）

示例：-OutputCulture 'en-US' 用于美国系统的日期格式。  
示例：-OutputCulture ([System.Globalization.CultureInfo]::InvariantCulture) 用于 ISO 格式。

```yaml
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 6
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -OutputFile

可选。  
输出 CSV 文件的路径。  
如果未指定，使用输入文件名并替换为 .csv 扩展名。

必须是文件路径，不能是目录。  
如果只想指定输出目录，请省略此参数，脚本将使用与输入文件相同的目录。

```yaml
Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Output
- Destination
- OutFile
- OutputPath
ParameterSets:
- Name: (All)
  Position: 1
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -OutputType

指定生成的输出类型。

有效值：  
- 'CSV'：仅生成解析日志数据的 CSV 文件（默认）  
- 'Statistic'：仅生成汇总数据的统计文件  
- 'Both'：同时生成 CSV 和统计文件

默认是 'Both'。

```yaml
Type: String
DefaultValue: Both
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: 4
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -RemoveSourceFile

成功处理后删除源 DNS 调试日志文件。

使用此开关可在成功解析输入文件并创建输出文件后自动删除输入文件。  
适用于：  
- 自动化日志处理流程  
- 日志收集场景中的磁盘空间管理  
- 防止重复处理已转换文件

安全特性：  
- 仅在成功处理并创建输出后删除文件  
- 处理失败或中断时跳过删除  
- 不能与 SkipHeaderValidation 一起使用以保证安全

警告：源文件将被永久删除。  
使用前请确保输出文件有效。

```yaml
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -SkipHeaderValidation

跳过 DNS 调试日志头部验证检查。

默认情况下，脚本会验证输入文件是否具有有效的 DNS 服务器调试日志头结构。  
使用此开关可跳过头部验证，适用于：  
- 处理修改过或自定义格式的日志  
- 解决验证问题  
- 处理非标准头部的日志

警告：使用此参数可能导致处理错误，如果文件不是有效的 DNS 日志。

```yaml
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### -WhatIf

显示如果运行 cmdlet 会发生什么。  
cmdlet 不会实际运行。

指定后，显示将执行的操作详细信息，但不执行它们。  
适用于：  
- 预览将处理哪些文件  
- 验证输出文件路径  
- 在生产环境运行前测试脚本

```yaml
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- wi
ParameterSets:
- Name: (All)
  Position: Named
  IsRequired: false
  ValueFromPipeline: false
  ValueFromPipelineByPropertyName: false
  ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
```

### CommonParameters

此 cmdlet 支持常用参数：-Debug、-ErrorAction、-ErrorVariable、  
-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、  
-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。更多信息请参见  
[about_CommonParameters](https://go.microsoft.com/fwlink/?LinkID=113216)。

## INPUTS

### System.String[]

## NOTES

版本：    1.2.0.0  
作者：    Andreas Bellstedt, Copilot  
日期：    2026-01-23  
关键词：  Microsoft, Windows Server, DNSServer, DNS, DebugLog, LogParser

## RELATED LINKS

- [github.com/AndiBellstedt/DNSServer.DebugLogParser](https://github.com/AndiBellstedt/DNSServer.DebugLogParser)
