You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中用DBATools导出多表CSV时如何统一设置日期格式

统一设置DBATools导出CSV的日期格式

我正在使用基于DBATools的PowerShell脚本,将多个数据表导出为独立的CSV文件。需要将表中的日期格式统一调整为yyyy-mm-dd,我尝试了网上找到的Set-DbatoolsConfig配置代码,但导出CSV中的日期格式并未生效。想请教是否无需逐个列设置,就能统一修改所有日期字段的输出格式?

原脚本:

Set-DbatoolsConfig -FullName 'Formatting.Date' -Value 'yyyy-MM-dd'

#Initiate a connection
$MyConnection = Connect-DbaInstance -SqlInstance LOCALHOST\MSSQLSERVER -TrustServerCertificate

#Define a list of tables
#Add table names here - there are actually around 100 tables in the actual code
$Tables = @("newspic", "Locations", "Users", "Info") 

#Iterate through the list
foreach ($Table in $Tables) {
    #Build the query
    $Query = "SELECT * FROM [$Table]"
    #Build the output file path 
    #and append the .csv extension
    $CsvPath = "C:\CSVOut\d\" + $Table + ".csv"
    #Run the query and export results to CSV
    Invoke-DbaQuery -SqlInstance $MyConnection -Database MyDatabase `
        -Query "$Query"  |  Export-Csv $CsvPath `
        -Delimiter "|" -NoTypeInformation -Encoding UTF8 
}

问题原因

Set-DbatoolsConfig -FullName 'Formatting.Date' 仅对DBATools自身的控制台输出生效,Export-Csv不会读取该配置,所以日期格式设置未被应用到CSV文件中。

无需逐个列设置的解决方案

可以在PowerShell层面遍历查询结果的每一行,自动识别所有DateTime类型的字段并统一格式化,修改后的脚本如下:

#Initiate a connection
$MyConnection = Connect-DbaInstance -SqlInstance LOCALHOST\MSSQLSERVER -TrustServerCertificate

#Define a list of tables
$Tables = @("newspic", "Locations", "Users", "Info") 

#Iterate through the list
foreach ($Table in $Tables) {
    $Query = "SELECT * FROM [$Table]"
    $CsvPath = "C:\CSVOut\d\" + $Table + ".csv"
    
    # 执行查询并批量处理日期格式
    Invoke-DbaQuery -SqlInstance $MyConnection -Database MyDatabase -Query $Query | ForEach-Object {
        $currentRow = $_
        # 遍历当前行的所有属性
        foreach ($property in $currentRow.PSObject.Properties) {
            # 判断属性值是否为DateTime类型
            if ($property.Value -is [DateTime]) {
                # 统一格式化为yyyy-MM-dd
                $property.Value = $property.Value.ToString("yyyy-MM-dd")
            }
        }
        # 返回处理后的行数据
        $currentRow
    } | Export-Csv $CsvPath -Delimiter "|" -NoTypeInformation -Encoding UTF8
}

补充说明

  • 该方法会自动识别所有DateTime类型字段,无需手动指定列名,适配大量表的批量导出场景。
  • 若需保留时间部分,可将格式字符串改为yyyy-MM-dd HH:mm:ss。
  • 针对查询结果中的可空日期(DBNull值),脚本会自动跳过,不会触发报错。

内容的提问来源于stack exchange,提问作者buck1112

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:22:53