Does anyone have examples of a types.custom.ps1xml file working correctly? I am aware of
Precision Computing - Add Custom Methods and Properties to Types in PowerShell
but I want more examples. Here's my experimental types.custom.ps1xml:
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio 1.0.8.0 -->
<Types><Type><Name>System.ServiceProcess.ServiceController</Name><Members><ScriptProperty><Name>LeanStartupType</Name><GetScriptBlock>{ $this.LeanStartupType }</GetScriptBlock><SetScriptBlock>{ if (($args[0] -eq "") -or ($args[0] -eq "Auto") -or
($args[0] -eq "Manual") -or ($args[0] -eq "Disabled")) {
$this.LeanStartupType = $args[0] } else { Write-Host ("Error:
LeanStartupType can only be Auto, Manual, Disabled, or the empty string") } }
</SetScriptBlock></ScriptProperty><ScriptProperty><Name>RichStartupType</Name><GetScriptBlock>{ $this.RichStartupType }</GetScriptBlock><SetScriptBlock>{ if (($args[0] -eq "") -or ($args[0] -eq "Auto") -or
($args[0] -eq "Manual") -or ($args[0] -eq "Disabled")) {
$this.RichStartupType = $args[0] } else { Write-Host ("Error:
RichStartupType can only be Auto, Manual, Disabled, or the empty string.") } }
</SetScriptBlock></ScriptProperty><AliasProperty><Name>Min</Name><ReferencedMemberName>LeanStartupType</ReferencedMemberName></AliasProperty><AliasProperty><Name>Max</Name><ReferencedMemberName>RichStartupType</ReferencedMemberName></AliasProperty><ScriptMethod><Name>Initialize</Name><Script>{ write-host "Initializing " + "$this.Name"; $this.Min = ""; $this.Max = "" }</Script></ScriptMethod></Members></Type>
</Types>It does indeed add members to the objects returned by the Get-Service commandlet, but I am not able to make Get, Set, or the Initialize script method do anything useful.
For example, after loading my custom types:
[1][4]>get-service | get-member
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Max AliasProperty Max = RichStartupType
Min AliasProperty Min = LeanStartupType
Name AliasProperty Name = ServiceName
add_Disposed Method System.Void add_Disposed(EventHandler value)
Close Method System.Void Close()
Continue Method System.Void Continue()
...........
Status Property System.ServiceProcess.ServiceControllerStatus Status {get;}
Initialize ScriptMethod System.Object Initialize();
LeanStartupType ScriptProperty System.Object LeanStartupType {get={ $this.LeanStartupType };set={ if (($ar...
RichStartupType ScriptProperty System.Object RichStartupType {get={ $this.RichStartupType };set={ if (($ar...
All well and good so far; the lavender items are my customizations. But
[1][6]>foreach ($serv in Get-Service) {$serv.Initialize}
simply writes the same junk again and again:
Script : { write-host "Initializing " + "$this.Name"; $this.Min = ""; $this.Max = "" }
OverloadDefinitions : {System.Object Initialize();}
MemberType : ScriptMethod
TypeNameOfValue : System.Object
Value : System.Object Initialize();
Name : Initialize
IsInstance : False
I don't want to see that 50 times! I just want it to run the damn script.



