4

我的脚本正在从 SQL Server 中的存储过程填充数据行。然后,我在整个脚本中引用此数据行中的特定列。我要做的是添加功能,如果行数 = 0,则执行操作 X,如果行数 = 1,则执行操作 Y,如果行数 > 1,则执行操作 Z。

-- PowerShell script snippet

# $MyResult is populated earlier; 
# GetType() returns Name=DataRow, BaseType=System.Object

# this works
ForEach ($MyRow In $MyResult) {

    $MyFile = Get-Content $MyRow.FileName
    # do other cool stuff
}

# this is what I'm trying to do, but doesn't work
If ($MyResult.Count -eq 0) {
    # do something
}
ElseIf ($MyResult.Count -eq 1) {
    # do something else
}
Else {
    # do this instead
}

如果我使用数组,我可以让 $MyResult.Count 工作,但是我不能直接引用 $MyRow.FileName。

这可能很简单,但我是 PowerShell 和面向对象语言的新手。我已尝试搜索此站点、脚本专家的博客和 Google,但我无法找到任何可以告诉我如何执行此操作的内容。

任何帮助深表感谢。

4

4 回答 4

3

它与您的填充方式有关$MyResult。如果您像这样查询数据库

$MyResult = @( << code that returns results from database >> )

也就是说,将返回数据库中的数据集/数据表的代码包含在 中@( ... ),然后返回的行数将很容易使用$MyResult.count.

如果您以这种方式填充 $MyResult,您的原始代码应该可以正常工作。

于 2014-02-03T21:31:39.960 回答
3

我知道这个线程很旧,但如果其他人在 Google 上找到它,这也应该适用于 PS V5:

替换$MyResult.Count为:($MyResult | Measure-Object | select -ExpandProperty Count)

例如:
If (($MyResult | Measure-Object | select -ExpandProperty Count) -eq 0)

于 2019-03-06T23:16:59.620 回答
1

我没有PS和SQL的经验,但我会尽力为你提供答案。如果您的 object$myresultdatarow-object,则意味着您只有一行。如果结果为空,则$myresult通常为空。

如果你得到一个或多个行,你可以把它们放在一个数组中并计算它。但是,如果你$myresult是空的,并且你把它放在一个数组中,它仍然会算作一个,所以我们需要注意这一点。试试这个:

If ($MyResult -eq $null) {
    # do something if no rows
}
Else If (@($MyResult).Count -eq 1) {
    # do something else if there are 1 rows.
    # The cast to array was only in the if-test, 
    # so you can reach the object with $myresult.
}
Else {
    # do this if there are multiple rows.
}
于 2013-03-13T21:33:28.377 回答
0

看起来这个问题得到了很多意见,所以我想发布我是如何处理这个问题的。:)

基本上,对我来说,解决方法是更改​​我用来在 SQL Server 上执行查询的方法。我切换到 Chad Miller 的 Invoke-SqlCmd2 脚本:TechNet: Invoke-SqlCmd2,即

# --------------- 
# this code works
# ---------------

# Register the function
. .\Invoke-Sqlcmd2.ps1

# make SQL Server call & store results to an array, $MyResults
[array]$MyResults = Invoke-Sqlcmd2 -Serve
rInstance "(local)" -Query "SELECT TOP 1 * FROM sys.databases;"

If ($MyResult -eq $null) {
    # do something
}
ElseIf ($MyResult.Count -eq 1) {
    # do something else
}
Else {
    # do this instead
}
于 2015-05-15T02:40:41.920 回答