2017-05-30 4 views
1

私はPowershellと2 functionsを開発しようとしています。最初に、私のデータベースステータス(online/offline)をチェックします。第2の関数は、ある状態が達成されるまで第1の関数をループする必要があります。Powershellで関数を再利用/拡張する方法は?

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のに新たなんだと私は、彼らが依存しているので、私は2番目一つに最初の関数から同じパラメータを書き換える自分自身を繰り返してはならないと思います。しかし、私は間違っているかもしれないので、質問です。

ありがとうございました!

+1

ない私はあなたの質問を理解するのではなく、より二つの機能を書くように聞こえる場合は、あなただけの1とを書きたいかもしれないことを確認のようなものを試してみてください条件に使用する余分なパラメータ。 – BenH

+0

こんにちは@BenH、私はそれをするだろうが、私の友人は、その目的のために2つの機能を作成することを主張した。おそらく、私は彼に他のことを納得させるべきでしょうか? :D –

+1

どのような構造を使用しても、複雑さが軽減され、効率が向上します。異なるパラメータセットとフラグを持つすべての含まれているコマンドレットを見てください。時には論理を分割する方が理にかなっています。時には結合するのが理にかなっています。それはプロジェクトに大きく依存します。良いアナログになる組み込みコマンドレットの例は 'Test-Connection'で、' -Quiet'パラメータと '-Count'を持っています。 – BenH

答えて

1

2番目の関数でこのパラメータを書き換え、ループを実行する最初の関数に別のパラメータを追加または追加する必要があります。私は第二の解決策をとるだろう。

その

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 
     } 
    } 

} 
関連する問題