我编写了以下PowerShell脚本来运行SP列表。当我运行它时,在第一个之后没有给出正确的结果,但是当我单独运行它们时,所有它们都作为第一个运行。
$Sps = "test_sp_HasPaidOrder",
"test_sp_HasPaidBKMOrder",
"test_sp_HasPaidCreditCardOrder"
foreach ($sp in $Sps)
{
$sp_name = $sp
echo "- - - $sp_name - - - "
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=server_adres;Database=db_name;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
$SqlCmd.CommandText = $sp_name
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables
}
结果:
PS C:\Users\mesut.gunes\Documents\scripts> .\run_sp1.ps1
- - - test_sp_HasPaidOrder - - -
1
HasPaidOrder
------------
True
- - - test_sp_HasPaidBKMOrder - - -
1
- - - test_sp_HasPaidCreditCardOrder - - -
1
我还尝试在Start-Sleep -s 3
之后添加$SqlAdapter.Fill($DataSet)
来处理并行执行但不修复它。怎么解决这个问题?
答案 0 :(得分:1)
在输出具有不同属性集的多个对象时,知道PowerShell问题:仅使用第一个对象的属性来确定表格式的列标题。
PS> $a =
>>> [PSCustomObject]@{a=1;b=2},
>>> [PSCustomObject]@{b=2;c=3},
>>> [PSCustomObject]@{c=3;d=4},
>>> [PSCustomObject]@{d=4;e=5},
>>> [PSCustomObject]@{e=5;f=6}
PS> function f {$a;$a}
PS> f
a b
- -
1 2
2
1 2
2
PS>
因此,当后一个对象与第一个对象没有任何共同属性时,会导致打印空行。
有多种方法可以解决这个问题:
明确指定要打印的列:
PS> f | ft a,b,c,d,e,f
a b c d e f
- - - - - -
1 2
2 3
3 4
4 5
5 6
1 2
2 3
3 4
4 5
5 6
PS>
使用列表格式:
PS> f | fl
a : 1
b : 2
b : 2
c : 3
c : 3
d : 4
d : 4
e : 5
e : 5
f : 6
a : 1
b : 2
b : 2
c : 3
c : 3
d : 4
d : 4
e : 5
e : 5
f : 6
PS>
或者您可以修改函数f
以管理每个单独的对象以分隔Out-Default
命令的实例。请注意,在这种情况下,对象打印在主机上(或Out-Default
决定做的任何事情)并且不会成为函数结果的一部分,因此您无法通过管道进一步处理对象。
PS> function f {$a | % {$_ | Out-Default}; $a | % {$_ | Out-Default}}
PS> f | Out-Null
a b
- -
1 2
b c
- -
2 3
c d
- -
3 4
d e
- -
4 5
e f
- -
5 6
a b
- -
1 2
b c
- -
2 3
c d
- -
3 4
d e
- -
4 5
e f
- -
5 6
PS>
注意,Out-Null
不会忽略函数输出,因为函数实际上没有输出它只是在主机上打印一些东西。