PowerShell无法将输出正确导出到CSV

时间:2019-06-26 13:39:19

标签: powershell export-to-csv

我正在尝试运行以下代码,但是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

1 个答案:

答案 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-elseServer。同样,请随意编辑,随意选择。

由于我们将脚本结果输出为CSV,因此我们必须将结果输出为具有匹配属性名称的对象。由于Servername has no errors命令的性质,您不能只输出带有消息的自由文本字符串。它们需要属于我们的自定义对象的属性。 Export-Csv导致字符串的长度,因为length是命令读取的唯一属性。