# encoding: ascii # api: csharp # title: ScriptTransforms module # description: PowerShell module that allows scripters to define argument transformation attributes in simple PowerShell syntax. This is an extension of Joel’s ScriptTransform example at http://huddledmasses.org/more-custom-attributes-for-powershell-parameters/ # version: 0.1 # type: function # author: beefarino # license: CC0 # function: new-parameterTransform # x-poshcode-id: 3024 # x-archived: 2016-06-30T14:45:34 # x-published: 2012-10-27T06:48:00 # # Example usage: # > import-module ScriptTransforms; # > Transform Test { $args0 + “Test” } # > function A( [Test()] $z ) { $z } # > A ‘asdf’ # asdfTest # function new-parameterTransform { [cmdletbinding()] param( [Parameter(Mandatory=$true,Position=0)] [string] $name, [Parameter(Mandatory=$true, Position=1)] [scriptblock] $script ) add-Type -TypeDefinition @" using System; using System.ComponentModel; using System.Management.Automation; using System.Collections.ObjectModel; [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public class ${name}Attribute : ArgumentTransformationAttribute { private ScriptBlock _scriptblock; private string _noOutputMessage = "Transform Script had no output."; public ${name}Attribute() { this.Script = ScriptBlock.Create( @" $($script.ToString() -replace '"','""' ) " ); } public override string ToString() { return Script.ToString(); } public override Object Transform( EngineIntrinsics engine, Object inputData) { try { Collection output = engine.InvokeCommand.InvokeScript( engine.SessionState, Script, inputData ); if(output.Count > 1) { Object[] transformed = new Object[output.Count]; for(int i =0; i < output.Count;i++) { transformed[i] = output[i].BaseObject; } return transformed; } else if(output.Count == 1) { return output[0].BaseObject; } else { throw new ArgumentTransformationMetadataException(NoOutputMessage); } } catch (ArgumentTransformationMetadataException) { throw; } catch (Exception e) { throw new ArgumentTransformationMetadataException(string.Format("Transform Script threw an exception ('{0}'). See `$Error[0].Exception.InnerException.InnerException for more details.",e.Message), e); } } public ScriptBlock Script { get { return _scriptblock; } set { _scriptblock = value; } } public string NoOutputMessage { get { return _noOutputMessage; } set { _noOutputMessage = value; } } } "@ } New-Alias -Name Transform -Value New-ParameterTransform; Export-ModuleMember -Alias Transform -Function *