First I would like to commend all the authors for the clear and concise way the book is written. With many chapters (40) but with each chapter averaging 15 pages it is easy to use the book as a reference source.
However, the overall tone of the Chapter 27 summary is that it is something for the propeller heads and that an administrator would not really need to use them. To some extent this is true as an extension does not do anything that can not be done by a script.
As you point out, extensions make a script easy to read. But a major benefit that is overlooked is that it adds intellisense to an object. This can improve object re-use in an organization.
As an example, a module may be made available to all administrators that includes a cmdlet
Get-FileName that gets the file-name portion from a full file name path string. In large modules remembering this cmdlet/script name may not be so easy so most developers would just roll their own script to do this. The more often they do this in scripts,the greater likelihood that errors are introduced.
If instead, an extension method GetFileName () was created for the system.string type, whenever an administrator has a string file path, simply by adding the dot operator the method would become A visible reminder to use the standard method. This is especially so if using an editor such as the PS3 Powershell_ISE.
I have included a small script below that will perhaps provide your readers with a better appreciation of the power of extension methods and how they can better be used to improve readability and encourage the use of standard methods.
As seen in the following line,"C:WindowsSystem32WindowsPowerShellv1.0Help.Format.ps1xml".IsFileType(".ps1xml") is more easily understood than would be a call to an equivalent function as it reads more like file path is file type .ps1xml ?".
.String.To.IO.Extensions.ps1
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName IsValidPath -Value {
Test-Path -Path $this
} -ErrorAction SilentlyContinue
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName ToFile -Value {
if (Test-Path $this -PathType container )
{
Write-Error -ErrorAction Stop `
-Exception System.InvalidOperationException `
-Message "Path is a directory! Supply a full path name to file."
return
}
Get-Item $this } -ErrorAction SilentlyContinue
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName GetParentDirectory -Value {
(Get-Item $this).Parent.FullName} -ErrorAction SilentlyContinue
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName GetFileName -Value {
if (Test-Path $this -PathType container )
{
Write-Error -ErrorAction Stop `
-Exception System.InvalidOperationException `
-Message "Path is a directory! Supply a full path name to file."
return
}
(Get-Item $this ).Name} -ErrorAction SilentlyContinue
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName GetFileExtension -Value {
(Get-Item $this ).Extension} -ErrorAction SilentlyContinue
Update-TypeData -TypeName System.String -MemberType ScriptMethod -MemberName IsFileType -Value {
(Get-Item $this ).Extension -eq $args[0]} -ErrorAction SilentlyContinue
#Tests
"C:/Windows/System32".IsValidPath() # smart enough to recognize as valid
"..Chapter22".IsValidPath() # depends if you have folder in relative path
"/etc/fstab".IsValidPath() # unix path false
"C:WindowsSystem32WindowsPowerShellv1.0Help.Format.ps1xml".IsValidPath()
"C:WindowsSystem32WindowsPowerShellv1.0".IsValidPath()
"C:WindowsSystem32WindowsPowerShellv1.0Help.Format.ps1xml".ToFile().ToString()
"C:WindowsSystem32WindowsPowerShellv1.0".ToFile().ToString() # Will throw exception as not file
"C:WindowsSystem32WindowsPowerShellv1.0
ubbishfilename.txt".ToFile().ToString() # Will throw exception as doesnot exist
"C:WindowsSystem32WindowsPowerShellv1.0Help.Format.ps1xml".GetParentDirectory()
"C:WindowsSystem32WindowsPowerShellv1.0".GetParentDirectory()
"C:WindowsSystem32WindowsPowerShellv1.0Help.Format.ps1xml".GetFileName()
"C:WindowsSystem32WindowsPowerShellv1.0".GetFileName() #Will throw exception as not file
"C:WindowsSystem32WindowsPowerShellv1.0Help.Format.ps1xml".GetFileExtension()
"C:WindowsSystem32WindowsPowerShellv1.0Help.Format.ps1xml".IsFileType(".ps1xml")
|