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 とオブジェクト指向言語は初めてです。このサイト、Scripting Guy のブログ、および Google を検索してみましたが、これを行う方法を示すものは何も見つかりませんでした。

どんな助けでも大歓迎です。

4

4 に答える 4

3

それはあなたがどのように入力するかに関係しています$MyResult。次のようにデータベースにクエリを実行すると

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

つまり、データベースからデータセット/データテーブルを返すコードを で囲むと、@( ... )返される行数は を使用して簡単に確認できます$MyResult.count

このように $MyResult を入力すると、元のコードはそのまま機能するはずです。

于 2014-02-03T21:31:39.960 に答える
1

PS と SQL の経験はありませんが、回答を提供しようと思います。object$myresultdatarow-object の場合は、1 行しかないことを意味します。結果が空の場合、$myresult通常は null になります。

1 行以上取得した場合は、それらを配列に入れてカウントできます。ただし、$myresultnull を配列に入れても 1 としてカウントされるため、注意が必要です。これを試して:

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 に答える