我正在尝试运行以下代码,但是PowerShell无法正确导出输出并出现以下错误:
执行超时已过期。在操作完成之前已经过了超时时间,或者服务器没有响应。
代码如下:
$SERVERS = gc "C:\Users\listOfServers.txt"
$out = foreach ($SERVER in $SERVERS) {
$InvokeParams = @{
Server = $SERVER
Database = 'test'
Username = 'admin'
Password = 'testpassword'
InputFile = 'C:\business.sql'
}
Invoke-SqlCmd @InvokeParams |
Select-Object -Property *, @{L='Server';E={$SERVER}}
}
$path = 'C:\Users\test1.csv'
$out | Export-Csv -Path $path
Invoke-Item -Path $path
目标是将当前输出导出到Excel,同时为没有任何输出的服务器添加一条语句。
ValueDate: 4/30/2019 12:00:00 AM PrevValueDate: 4/29/2019 12:00:00 AM Count:2100 Server 1 Server 2 : no errors **NEEDS TO BE ADDED ValueDate: 4/30/2019 12:00:00 AM PrevValueDate: 4/29/2019 12:00:00 AM Count:100 Server 3
基于这些问题和一些有用的答案:Powershell - Separate output based on Server + export to Excel。
答案 0 :(得分:1)
这应该输出您需要的内容:
$SERVERS = gc "C:\Users\listOfServers.txt"
$out = foreach ($SERVER in $SERVERS) {
$InvokeParams = @{
Server = $SERVER
Database = 'test'
Username = 'admin'
Password = 'testpassword'
InputFile = 'C:\business.sql'
QueryTimeout = 60
}
try {
$queryResults = $null
$queryResults = Invoke-SqlCmd @InvokeParams -Erroraction stop
if ($queryResults) {
$queryResults | Select-Object -Property *, @{L='Server';E={$SERVER}}
}
else {
"" | Select-Object @{L='Server';E={"{0} has no errors" -f $SERVER}}
}
}
catch {
"" | Select-Object @{L='Server';E={"{0} produced an Error" -f $SERVER}}
Continue
}
}
$path = 'C:\Users\test1.csv'
$out | Export-Csv -Path $path -NoTypeInformation
说明:
我在哈希表(-Querytimeout
)中添加了$InvokeParams
参数,其值为60秒。如果您同意查询在30秒后超时,则可以完全删除该Querytimeout = 60
行。如果您知道更合适的方法,则可以增加或减少该值。根据我的测试,默认值似乎是30秒。
我实现了try-catch
块,并将必需的-Erroraction Stop
参数添加到您的Invoke-SqlCmd
中。如果存在查询超时,则catch块将激活并输出值为Server
的{{1}}属性。随意编辑它,但是您选择。 Servername produced an error
语句在这里很关键,因为它使您可以捕获异常,然后继续进行Continue
中的下一项。如果没有$Servers
,您的脚本将停止处理。
我添加了Continue
语句来验证您的SQL脚本是否输出了任何结果。如果有结果,则返回您的原始代码预期的输出。如果有错误,则它将输出if-else
和Server
。同样,请随意编辑,随意选择。
由于我们将脚本结果输出为CSV,因此我们必须将结果输出为具有匹配属性名称的对象。由于Servername has no errors
命令的性质,您不能只输出带有消息的自由文本字符串。它们需要属于我们的自定义对象的属性。 Export-Csv
导致字符串的长度,因为length是命令读取的唯一属性。