2016-12-30 66 views
3

編輯,以減少對既定目標PowerShell是否提供了創建函數註釋的方法?

混亂是可以創建任何類型的註釋,可以申請的通用模式的功能?

一個例子可能是一個標準的錯誤處理例程。而不是必須使用錯誤處理函數來實現相同的try/catch結構,那麼可以使用可以修飾函數的屬性或註釋來實現常規模式,而不必在每個函數中使用相同的顯式代碼。

也許這是一個試圖讓PowerShell做一些它並不意味着要做的事情的例子,但是我想避免一些在我的腳本中最常見的重複。

+0

有'[ValidateScript()]'。 [這是一個ValidateScript指南](https://powershell.org/2013/05/21/validatescript-for-beginners/),這裏是[Boe Prox參數驗證指南](https://learn-powershell.net/2014/02/04/using-powershell-parameter-validation-to-make-your-day-easily /)以及一些其他驗證方法,如ValidatePattern也可以適用 – BenH

+0

對參數驗證屬性的引用更多是朝着我想裝飾參考現有PowerShell功能的功能的方式點頭致意。回想起來,我可能應該堅持提到註釋,因爲實施常見模式更多是我的興趣所在。 –

+0

看起來您正在詢問函數級別的屬性,類似於[CmdletBinding()]。 –

回答

2

你只需要從ValidateArgumentsAttribute類繼承和Validate方法提供自定義的驗證邏輯:
C#:

Add-Type @‘ 
    using System; 
    using System.Management.Automation; 
    public class ValidateIsEvenAttribute : ValidateArgumentsAttribute { 
     protected override void Validate(object arguments, EngineIntrinsics engineIntrinsics) { 
      if(LanguagePrimitives.ConvertTo<int>(arguments)%2==1) { 
       throw new Exception("Not even"); 
      } 
     } 
    } 
’@ 

PowerShell的V5:

class ValidateIsOddAttribute : Management.Automation.ValidateArgumentsAttribute { 
    [void] Validate([object] $arguments, [Management.Automation.EngineIntrinsics] $engineIntrinsics) { 
     if($arguments%2-eq0) { 
      throw 'Not odd' 
     } 
    } 
} 

然後你可以應用屬性功能參數:

function f { param([ValidateIsEven()]$i, [ValidateIsOdd()] $j) $i, $j } 

f 2 1 #OK 
f 2 2 #Error 
f 1 1 #Error 
+0

謝謝,這是一個很好的答案,因爲它涉及到參數屬性。我修改了這個問題來澄清,因爲我沒有太多嘗試裝飾參數,因爲我希望在不重寫類似代碼的情況下在函數中實現常用模式。 –

相關問題