【发布时间】: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