如何在Powershell上重用/扩展函数?

时间:2017-05-30 16:29:20

标签: powershell

我正在尝试用functions开发2 Powershell。第一个,将检查我的数据库状态(online / offline)。第二个函数应该循环第一个函数,直到达到某个状态。

function Get-DBStatus
{
  <# .. removed help section for brevity .. #>
  [CmdletBinding()]
  [OutputType([System.Object])]
  param
  (
    [Parameter(Mandatory = $true)]
    [String]$ServerName,
    [Parameter(Mandatory = $true)]
    [String]$ServerUser,
    [Parameter(Mandatory = $true)]
    [String]$ServerPassword,
    [Parameter(Mandatory = $true)]
    [String]$DatabaseName,
  )

  try
  {
    $params = @{ ... }     
    $dbStatus = Invoke-SqlConnection @params | Where-Object {$_.Name -match $AltDBName }
  }
  catch
  {
    Write-Error -Message ('An error has occured while ...')
  }
  if ([String]::IsNullOrEmpty($dbStatus) -eq $false)
  {
    $dbStatus
  }

 # <<< function Get-DbStatusOnlyIf 
 # <<< same parameters as the function above
 # <<< get the desired status as a new parameter
 # <<< loop the function above until the desired status is achieved or a timeout is reached

}

我是Powershell的新手,我想我不应该重复自己从第一个函数重写相同的参数到第二个函数,因为它们是依赖的。但是,我可能错了,因此问题。

感谢您的协助!

1 个答案:

答案 0 :(得分:1)

你必须在你的第二个函数上重写这个参数并传递它们或者为你的第一个函数添加另一个参数来进行循环。我会选择第二种解决方案。

尝试类似的东西

function Get-DBStatus {
    <# .. removed help section for brevity .. #>
    [CmdletBinding()]
    [OutputType([System.Object])]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]$ServerName,
        [Parameter(Mandatory = $true)]
        [String]$ServerUser,
        [Parameter(Mandatory = $true)]
        [String]$ServerPassword,
        [Parameter(Mandatory = $true)]
        [String]$DatabaseName,
        $WaitForStatus, #or something like that
        [int]$Timeout=10
    )
    do { 
        try {
            #$params = @{ ... }     
            $dbStatus = Invoke-SqlConnection @params | Where-Object {$_.Name -match $AltDBName }
        }
        catch {
            Write-Error -Message ('An error has occured while ...')
            return
        }
        if ([String]::IsNullOrEmpty($dbStatus) -eq $false) {
            if ($WaitForStatus){
                if ($dbStatus -eq $WaitForStatus) {
                    $dbStatus
                    $EndLoop = $true               
                }
                else {
                    Write-Host -NoNewline "." #only for test   
                    Start-Sleep -Seconds 1
                    $Timeout -= 1                  
                }
            }
            else{
                $dbStatus
                $EndLoop = $true
            }
        }
    }
    until ($EndLoop -or $Timeout -eq 0)              
}

或递归

function Get-DBStatus {
    <# .. removed help section for brevity .. #>
    [CmdletBinding()]
    [OutputType([System.Object])]
    param
    (
        [Parameter(Mandatory = $true)]
        [String]$ServerName,
        [Parameter(Mandatory = $true)]
        [String]$ServerUser,
        [Parameter(Mandatory = $true)]
        [String]$ServerPassword,
        [Parameter(Mandatory = $true)]
        [String]$DatabaseName,
        $WaitForStatus, #or something like that
        [int]$timeout = 3
    )
    if ($WaitForStatus) {    
        $start = Get-Date
        while (((get-date) - $start).TotalSeconds -lt $timeout) {
            $res = Get-DBStatus -ServerName $ServerName -ServerUser $ServerUser -ServerPassword $ServerPassword -DatabaseName $DatabaseName
            if ($WaitForStatus -eq $res) {
                return $res
            }
            Start-Sleep -Seconds 1        
        }

    }
    else {
        try {
            $params = @{ ... }     
            $dbStatus = Invoke-SqlConnection @params | Where-Object {$_.Name -match $AltDBName }
        }
        catch {
            Write-Error -Message ('An error has occured while ...')
        }
        if ([String]::IsNullOrEmpty($dbStatus) -eq $false) {
            $dbStatus
        }
    }

}