Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell未将输出正确导出为CSV_Powershell_Export To Csv - Fatal编程技术网

PowerShell未将输出正确导出为CSV

PowerShell未将输出正确导出为CSV,powershell,export-to-csv,Powershell,Export To Csv,我正在尝试运行以下代码,但PowerShell未正确导出输出并出现以下错误: 执行超时已过期。操作完成前已过超时时间,或者服务器没有响应 代码如下: $SERVERS = gc "C:\Users\listOfServers.txt" $out = foreach ($SERVER in $SERVERS) { $InvokeParams = @{ Server = $SERVER Database = 'test' Username

我正在尝试运行以下代码,但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 估价日期:2019年4月30日上午12:00:00 PrevValueDate:2019年4月29日上午12:00:00 计数:2100 服务器1 服务器2:无错误**需要添加 估价日期:2019年4月30日上午12:00:00 PrevValueDate:2019年4月29日上午12:00:00 计数:100 服务器3
基于这些问题和一些有用的答案:。

这将输出您需要的内容:

$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
说明:

我在哈希表(
$InvokeParams
)中添加了
-Querytimeout
参数,值为60秒。如果您同意查询在30秒后超时,则可以完全删除该
Querytimeout=60
行。如果知道更合适的方法,可以增加或减少该值。根据我的测试,默认值似乎是30秒

我实现了
try-catch
块,并将所需的
-Erroraction-Stop
参数添加到
Invoke-SqlCmd
中。如果查询超时,catch块将激活并输出值为
Servername的
Server
属性,该属性产生错误。无论您选择什么,都可以随意编辑。
Continue
语句在这里很关键,因为它允许您捕获异常,然后继续执行
$Servers
中的下一项。如果没有
继续
,脚本将停止处理

我添加了
if-else
语句来验证SQL脚本是否输出了任何结果。如果有结果,则返回原始代码预期的输出。如果有错误,则它将输出带有
Servername无错误的
服务器属性
。同样,您可以随意编辑您选择的内容


因为我们要将脚本结果输出到CSV,所以必须将结果输出为具有匹配属性名称的对象。由于
Export Csv
命令的性质,您不能只输出带有消息的自由文本字符串。它们必须属于自定义对象的属性<代码>“一个字符串”|导出Csv
会产生字符串的长度,因为长度是命令读取的唯一属性。

导出前,
$out
是什么样子,以及在
$servers
中有多少服务器?您是每台服务器都收到错误还是只收到一次错误?看起来像上面的输出,但我仍然需要一些帮助,以返回一条消息,例如服务器2:无错误-45 Total由于超过查询超时时间,因此会发生此错误。您预计查询返回数据需要多长时间?在我的测试系统上,30秒后会发生这种情况。我不太确定,请等待每个服务器的数据。尝试添加:SqlCommand c=newsqlcommand()c.CommandTimeout=0;代码中的某个地方??如果您希望查询返回数据的时间超过30秒,则应添加
-querytimeout x
参数,其中x是秒数。感谢您的时间和解释。我现在正在运行代码,再次出现超时错误,可能需要增加超时。一旦出现错误,csv文件将生成一个空白结果。我会增加知道的时间并再次运行它。请确保按现在的方式复制代码。我又添加了一条语句,这可能有助于数据输出的一致性。另外,
$queryResults=$null
删除了它在每次迭代中包含的数据。我们差不多做到了,再次感谢您-excel工作表中没有显示错误。它导出了以下内容:服务器1没有错误,服务器2没有错误,服务器3,服务器4。电子表格中缺少3和4的错误,也没有显示错误,而是显示错误的数量。Server5有3个错误,在电子表格中我看到了以下内容:服务器5、服务器5、服务器5,一个在另一个之上