Функция Powershell Параметры для фильтрации

sql-server tsql powershell

156 просмотра

2 ответа

Я пытаюсь написать функцию, которая извлекает все мои серверы из базы данных SQL. Работает правильно. Мне нужно реализовать фильтрацию для каждого столбца, чтобы я мог вызвать функцию с одним или несколькими фильтрами ..

например, если мне нужно вытащить все UAT-сервер, я должен иметь возможность написать что-то вроде этого, и он должен вытащить все UAT -

Get-SHservers -Enviornment "UAT"

или же

Get-Shservers -Enviornment "uat" -Приложение "App1"

или любая комбинация этого

function Get-SHServers
{
    $connectionstring = (Get-SHJson "D:\config\configdb.json").value
    $server =  Get-SHSQLData $connectionstring -Query @"
    select 
        b.Name as ApplicationName, 
        a.Name as ServerName,   
        a.FQDN,
        c.Name ServerRole,
        e.Name as Enviornment,
        d.Name Domain,
        f.Name ServerRegion
    from 
            server a inner join Application b on a.ApplicationID = b.ID 
            left join ServerRole c on a.ServerRoleId = c.Id
            left join Domain d on a.DomainID = d.id
            left join Enviornment e on a.EnviornmentId = e.Id
            left join ServerRegion f on a.ServerRegionID = f.Id
        WHERE 1=1
    order by 1
    "@
    foreach($item in $server) {
        $output = [ordered] @{
                    ServerName = $item.ServerName
                    FQDN = $item.FQDN
                    ApplicationName = $item.ApplicationName
                    ServerRole = $item.ServerRole
                    Domain = $item.Domain
                    Enviornment = $item.Enviornment 
                    ServerRegion = $item.ServerRegion
        }
        $obj = new-object -TypeName PSObject -property $output
        $obj.psobject.TypeNames.Insert(0, "sh.config.server")
        write-output $obj
    }
    }

Я предпочитаю встраивать фильтр в SQL по соображениям производительности, любая помощь для реализации этого поведения? * Должен ли я передать 7 различных параметров в функцию и проверить в [если еще], если передан один или несколько параметров, и создать SQL, или в Powershell есть более простой способ сделать это *

Кроме того, вот реализация Get-SHSQLData

  [CmdletBinding()] param(
    [Parameter(Mandatory=$true)][string]$Query,
    [Parameter(Mandatory=$true)][string]$connectionstring
    )

    $Connection = New-Object System.Data.SQLClient.SQLConnection
    $Command    = New-Object System.Data.SQLClient.SQLCommand
    $Adapter    = New-Object System.Data.SqlClient.SqlDataAdapter
    $DataSet    = New-Object System.Data.DataSet


    if ($Query.Trim() -eq '' -or $connectionstring.Trim() -eq ''){
        write-host 'Query and ConnectionString are Mandatory Parameter' -ForegroundColor Red;
        return;
    }
    #$connectionstring = "server=$servername;database=$DatabaseName;trusted_connection=true;pooling=false"
    $connection.ConnectionString = $connectionstring;
    $Connection.Open()
    $Command.Connection = $Connection
    $Command.CommandText = $Query
    $Adapter.SelectCommand = $Command
    $Adapter.Fill($DataSet) | out-NULL
    $Connection.Close()
    $Connection.Dispose()
    return $DataSet.Tables[0]
Автор: Shiju Samuel Источник Размещён: 08.11.2019 11:27

Ответы (2)


1 плюс

Решение

Да , вы должны передать 7 различных параметров в функцию, но нет , на самом деле нет более простого способа сделать это, потому что это уже так просто. Вот пример с вашими первыми двумя параметрами:

function Get-Stuff
{
     param
     (
         [string]$AppName,
         [string]$ServerName
     )

     $whereClause = '1=1'
     if ($AppName) { $whereClause += " AND ApplicationName = '$AppName'"}
     if ($ServerName) { $whereClause += " AND ServerName = '$ServerName'"}
     Write-Host $whereClause    # this line is debug output only
}

И вот несколько примеров, демонстрирующих его использование:

PS> Get-Stuff
1=1

PS> Get-Stuff -AppName "my app"
1=1 AND ApplicationName = 'my app'

PS> Get-Stuff -Server 'localhost' -AppName 'big app'
1=1 AND ApplicationName = 'big app' AND ServerName = 'localhost'

(Сноска. Взгляните на Invoke-SqlCmd , который позволит вам значительно уменьшить размер кода.)

Автор: Michael Sorens Размещён: 22.08.2016 12:07

0 плюса

Попробуйте использовать наборы параметров. Таким образом, вы можете использовать Get-SHservers -Set1илиGet-SHservers -Set2

Function SCCM-ScheduledReboot{
 [CmdletBinding(SupportsShouldProcess=$true,DefaultParameterSetName="ViewOnly")]
Param(
    [Parameter(ParameterSetName="ViewOnly")]
    [switch]$ViewOnly,
    [Parameter(ParameterSetName="CSV")]
    [switch]$CSV,
    [Parameter(ParameterSetName="Create")]
    [switch]$Create,
    [Parameter(ParameterSetName="Create")]
    [switch]$Email
)


    Switch($PSCmdlet.ParameterSetName){
        "ViewOnly"{
        ViewOnly
        }
        "CSV"{
        CSV
        }
        "Create"{
        Create
        }
    }
}#end sccm-scheduledreboot function

Здесь я создаю функцию SCCM-ScheduledReboot, которая включает три набора параметров. По умолчанию это ViewOnly, когда функция запускается без параметра, по умолчанию это ViewOnly.

Далее я мог бы использовать SCCM-ScheduledReboot -CSVи функция вызовет функцию CSV.

При желании ваша функция может иметь один параметр, который передается в SQL-запрос, содержащийся в строке here.

Function SCCM-ScheduledReboot{
 Param(
    [Parameter()]
    [string]$ServerQuery
)

$Here-String-Query = @"
<< Your SQL query here, include $ServerQuery >>
"@

}#end sccm-scheduledreboot function
Автор: user4317867 Размещён: 20.08.2016 03:29
Вопросы из категории :
32x32