0

この投稿に続いて、Powershellで機能の使用を実装しようとしています

Function cUsing {
    param (
        [System.IDisposable] $inputObject = $(throw "The parameter -inputObject is required."),
        [ScriptBlock] $scriptBlock = $(throw "The parameter -scriptBlock is required.")
    )
    Try { &$scriptBlock }
    Finally {
        if ($inputObject -ne $null) {
            if ($inputObject.psbase -eq $null) {
                $inputObject.Dispose()
            } else {
                $inputObject.psbase.Dispose()
            }
        }
    }
}


    cUsing($sqlConnection = New-Object System.Data.SqlClient.SqlConnection)
{
$sqlConnection.ConnectionString = "Server=myserver; Database=master; Integrated Security= True"
$sqlConnection.Open()
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.CommandText = "SELECT STATEMENT"
$sqlCmd.Connection = $sqlConnection
$dsValues = New-Object System.Data.DataSet
$daValues = New-Object System.Data.SqlClient.SqlDataAdapter($sqlCmd)
$daValues.Fill($dsValues)
Write-Host $dsValues.Tables[0]
}

エラー:

[ScriptBlock] $scriptBlock = $(throw  <<<< "The parameter -scriptBlock is required.")

[グレイマー]を編集

下のように中かっこを動かしたとき

cUsing($sqlConnection = New-Object System.Data.SqlClient.SqlConnection){
....
....
 Write-Host $dsValues.Tables[0]}

エラーは発生していませんが、取得している出力は

    $sqlConnection.ConnectionString = "Server=myserver; Database=master; Integrated Security= True"
$sqlConnection.Open()
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.CommandText = "Select query"
$sqlCmd.Connection = $sqlConnection
$dsValues = New-Object System.Data.DataSet
$daValues = New-Object System.Data.SqlClient.SqlDataAdapter($sqlCmd)
$daValues.Fill($dsValues)
Write-Host $dsValues.Tables[0]

編集[AnsgarWiechers]

スクリプトブロックの行を次のように変更したとき

Function cUsing {
param (
    [System.IDisposable] $inputObject = $(throw "The parameter -inputObject is required."),
    [ScriptBlock] $scriptBlock = ${throw "The parameter -scriptBlock is required."}
)

エラーは発生していませんが、上記の編集で示したものと同じ出力が得られます。

4

3 に答える 3

0

スクリプトブロックは、ではなく中括弧で定義されます$()。このような:

[ScriptBlock]$scriptBlock = { throw "The parameter ..." }

$()部分式を評価するための演算子です。

于 2013-03-26T17:41:40.727 に答える
0
    Add-Type @"
        using System;

        public class Code : System.IDisposable
        {
            public bool IsDisposed { get; set; }
            public void Dispose() 
            {
                Dispose(true);
                GC.SuppressFinalize(this);      
            }

            protected virtual void Dispose(bool disposing)
            {
                if (!IsDisposed)
                {
                    IsDisposed = true;   
                }
            }
        }
    "@

    function using-block {
        param (
            [System.IDisposable]$InputObject = $(throw "The parameter -inputObject is required."),
            [ScriptBlock]$ScriptBlock = $(throw "The parameter -scriptBlock is required.")
        )
        try { &$ScriptBlock }
        finally {
            if ($InputObject) {
                if ($InputObject.PSBase) {
                    $InputObject.PSBase.Dispose()
                } else {
                    $InputObject.Dispose()
                }
            }
        }
    }

    using-block($c = New-Object Code) {
        $c.IsDisposed
    }
    $c.IsDisposed

出力:

誤り

于 2013-03-26T18:02:23.630 に答える
0

コードの問題は、スクリプトブロックをパラメーターとしてではなく、それ自体のコマンドとして提供することです。Powershellのコマンドは1行にあります。コードはusingパラメーターのみを使用してコマンドを実行し、失敗します。次に、スクリプトブロックを宣言します。

ここには2つのオプションがあります。改行をエスケープする(悪い練習)か、コマンドの一部と見なされるように、最初のカーリーブレースを1行上に移動しcusingます。このような:

cUsing($sqlConnection = New-Object System.Data.SqlClient.SqlConnection) {
    $sqlConnection.ConnectionString = "Server=myserver; Database=master; Integrated Security= True"
...
..
.
}
于 2013-03-26T18:47:16.850 に答える