2016-10-27 4 views
1

を制限:PowerShellの機能は、以下のような関数を作成しようとしていデータタイプ

Function Get-SqlErrorLogPrevious24 { 
    [CmdletBinding()] 
    Param (
     [Parameter(Mandatory=$True,Position=1)] 
     [Microsoft.SqlServer.Management.Smo.Server]$Server 
    ) 

    ($Server.ReadErrorLog()).where{$_.logdate -ge ((Get-Date).AddHours(-24))} 
} 

私も気づいた何を、私は単なる文字列ではなくサーバーのオブジェクトを渡すことができるということです。

Powershellに渡されるデータ型を強く強制する方法はありますか、それとも常に暗黙的に文字列をSMOオブジェクトに変換しますか?

答えて

3

いいえPowerShellには、関数で受け取ったものが正しいタイプであることを確認するために使用するいくつかの「戦略」があります。渡された値(この場合は文字列)を必要な型(SMOオブジェクト)に変換するためにそれらの1つを使用できる場合は、その処理を行います。ここで

は直接割り当てgreat post which lists 10 different strategies.

  1. です。入力が直接割り当て可能な場合は、入力をその型にキャストするだけです。
  2. 言語ベースの変換。これらの言語ベースの変換は、ターゲットタイプがvoid、Boolean、String、Array、Hashtable、PSReference([ref])、XmlDocument([xml])の場合に実行されます。デリゲート(ScriptBlockで代理変換をサポートするため)、および列挙型。
  3. パーズ変換。ターゲットタイプがその入力を受け取るParse()メソッドを定義している場合は、それを使用します。
  4. スタティック変換を作成します。ターゲットタイプがその入力を受け取るstatic :: Create()メソッドを定義している場合は、それを使用します。
  5. コンストラクタの変換。ターゲットタイプが入力を受け取るコンストラクタを定義している場合は、それを使用します。
  6. キャスト変換。ターゲットタイプがソースタイプからの暗黙的または明示的キャスト演算子を定義している場合は、それを使用します。ソース・タイプが暗黙的または明示的なキャスト演算子をターゲット・タイプに定義している場合は、それを使用します。
  7. IConvertible変換。ソースタイプが、ターゲットタイプに変換する方法を知っているIConvertible実装を定義している場合は、それを使用します。
  8. IDictionary変換。ソースタイプがIDictionary(Hashtable)の場合、デフォルトのコンストラクタを使用して宛先タイプのインスタンスを作成し、IDictionaryの名前と値を使用してソースオブジェクトのプロパティを設定します。
  9. PSObjectプロパティの変換。ソースタイプがPSObjectの場合は、デフォルトコンストラクタを使用して宛先タイプのインスタンスを作成し、PSObjectのプロパティ名と値を使用してソースオブジェクトのプロパティを設定します。 。名前がプロパティではなくメソッドにマップされている場合は、値を引数としてそのメソッドを呼び出します。
  10. タイプコンバータの変換。変換を処理できる登録済みのTypeConverterまたはPSTypeConverterがある場合は、それを行います。 TypeConverterは、types.ps1xmlファイル($ pshome \ Types.ps1xmlを参照)またはUpdate-TypeDataを使用して登録できます。
4

あなたはタイプが異なる場合に例外をスロー思われる、カスタム変換属性を実装できます。

Add-Type @' 
    using System; 
    using System.Management.Automation; 
    public class EnforceTypeAttribute : ArgumentTransformationAttribute { 
     private Type type; 
     public EnforceTypeAttribute(Type type) { 
      this.type=type; 
     } 
     public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) { 
      if(type.IsInstanceOfType(inputData)) { 
       return inputData; 
      } else { 
       throw new Exception("Incorrect type."); 
      } 
     } 
    } 
'@ 

function f {param([int]$i) $i} 
function g {param([EnforceType([int])][int]$i) $i} 

f 1 #OK 
f '1' #OK 
g 1 #OK 
g '1' #Error 
関連する問題