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]

编辑 [Ansgar Wiechers]

当我将 scriptblock 行更改为

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

我没有收到任何错误,但我得到了与上面编辑中显示的相同的输出。

4

3 回答 3

0

您的代码的问题在于您没有将脚本块作为参数提供,而是作为自己的命令提供。Powershell 中的命令位于一行中。您的代码仅使用 using 参数运行命令,但失败。然后你声明一个脚本块。

您在这里有两个选择;转义换行符(不好的做法),或将左大括号向上移动一行,以便将其视为cusing命令的一部分。像这样:

cUsing($sqlConnection = New-Object System.Data.SqlClient.SqlConnection) {
    $sqlConnection.ConnectionString = "Server=myserver; Database=master; Integrated Security= True"
...
..
.
}
于 2013-03-26T18:47:16.850 回答
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

脚本块是通过花括号定义的,而不是通过$(). 像这样:

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

$()是评估子表达式的运算符。

于 2013-03-26T17:41:40.727 回答