【问题标题】:Powershell outputs mixed between loops - SQL datasets [duplicate]Powershell输出在循环之间混合 - SQL数据集[重复]
【发布时间】:2020-11-27 20:41:48
【问题描述】:

我有一个循环遍历 3 个服务器列表的 PowerShell 脚本。使用 Invoke-Sqlcmd 运行 SQL 脚本,并将结果集存储到变量 $DS。在循环结束时,我使用$DS.Tables.Rows 返回记录。

但是结果集混在一起了。我尝试使用Write-Host 消息来分解结果。但它们仍然混合在一起。

为什么结果在输出中混合在一起?

如何分离每个循环之间的输出?

谢谢

对象类型

$DS | gm ............... TypeName: System.Data.DataSet

$DS.Tables | gm ........ TypeName: System.Data.DataTable

$DS.Tables.Rows | gm ... TypeName: System.Data.DataRow

脚本

#########################>

# SQL servers
$PCList= @("GCOD139","GCOD039","GCOP039") 
Write-Host ($PCList -join ", ") 

# Query multiple servers
foreach ($PC in $PCList) {

    Write-Host ($PC + "...") -ForegroundColor Yellow

    # SQL parameters
    $Params = @{
        'ServerInstance' = $PC;  
        'Database' = 'master';
    #   'Username' = 'svcBIPOC';
    #   'Password' = 'bipoc2020*';
    #   'InputFile' = "C:\ScriptFolder\TestSqlCmd.sql"
        'Query' = '
            SELECT 
                [Server]= @@SERVERNAME
                --MB to GB
                , REPLACE(name, ''MB'', ''GB'')
                ,[value]= CAST(value as int)/1000
                , [value_in_use]= CAST(value_in_use as int)/1000
                --, value, value_in_use, [description]
            FROM sys.configurations
            WHERE name like ''%server memory%''
            ORDER BY name desc 
            OPTION (RECOMPILE);
        '
    }

    # Capture SQL Dataset
    # (Get-Date).ToSTring('s')  + " SQL query start..."
    $DS = Invoke-Sqlcmd @Params -As DataSet
    #(Get-Date).ToSTring('s')  + " SQL query end..."

    Write-host "-----"
    Write-host "SQL"

    sleep -Seconds 5
    $DS.Tables.Rows
    sleep -Seconds 5

}


#########################

【问题讨论】:

  • 虽然 Mathias 建议使用 Write-Progress 而不是 绕过您的问题,但其根本原因已在接受的 answer to the linked question 中解释。
  • 按照链接文章中的建议使用 Out-Host 确实解决了这个问题。所以$DS.Tables.Rows | Out-Host

标签: sql powershell loops foreach sqlps


【解决方案1】:

停止使用Write-Host 传达进度信息 - 改为使用Write-Progress

$PCList= @("GCOD139","GCOD039","GCOP039") 
Write-Progress -Activity "Query servers" -Status "About to query: $($PCList -join ", ")"

# Query multiple servers
foreach ($PC in $PCList) {

    Write-Progress -Activity "Query servers" -Status "Querying: $PC"

    # SQL parameters
    $Params = @{
        'ServerInstance' = $PC;  
        'Database' = 'master';
    #   'Username' = 'svcBIPOC';
    #   'Password' = 'bipoc2020*';
    #   'InputFile' = "C:\ScriptFolder\TestSqlCmd.sql"
        'Query' = '
            SELECT 
                [Server]= @@SERVERNAME
                --MB to GB
                , REPLACE(name, ''MB'', ''GB'')
                ,[value]= CAST(value as int)/1000
                , [value_in_use]= CAST(value_in_use as int)/1000
                --, value, value_in_use, [description]
            FROM sys.configurations
            WHERE name like ''%server memory%''
            ORDER BY name desc 
            OPTION (RECOMPILE);
        '
    }

    # Capture SQL Dataset
    $DS = Invoke-Sqlcmd @Params -As DataSet
    $DS.Tables.Rows
}

Write-Progress -Activity "Query servers" -Completed

现在进度消息不会干扰函数的实际输出

【讨论】:

  • 我试过这个。虽然 Write-Progress 很有趣(它在脚本运行时提供了一个突出显示的状态栏),但它并没有解决我的问题。数据集结果仍然是混合的。我希望输出在每个结果集之间有一个分隔符,例如“----- SQL ----”文本消息,
  • @SherlockSpreadsheets .\yourscript.ps1 |Format-List -GroupBy Server exact 文本)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多