# ============================================================================================== # # Microsoft PowerShell Source File -- Created with SAPIEN Technologies PrimalScript 2009 # # NAME: Better Functions.ps1 # # AUTHOR: Jeffery Hicks , SAPIEN Technologies # DATE : 5/19/2009 # # COMMENT: How to take an ok function and make it better # # ============================================================================================== Function Get-Simple { $name=Read-Host "Enter a name" $password=Read-Host "Enter a password" -asSecureString $size=Read-Host "Enter a size" $server=Read-Host "Enter a server name" } #this fails because the variables don't survive the scope Get-Simple Write-Host "Creating $name on $server" -foregroundcolor CYAN Function Get-Simple2 { #assign variables to the parent scope #not a best practice but legal $script:name=Read-Host "Enter a name" $script:password=Read-Host "Enter a password" -asSecureString $script:size=Read-Host "Enter a size" $script:server=Read-Host "Enter a server name" } #this now works, but the function is limited Get-Simple2 Write-Host "Creating $name on $server" -foregroundcolor CYAN #look what kind of value $i provide based on $size from the function $i=$size*4 $i Function Get-Better { #let's create an object $name=Read-Host "Enter a name" $password=Read-Host "Enter a password" -asSecureString #cast $size as an integer [int]$size=Read-Host "Enter a size" $server=Read-Host "Enter a server name" #create an empty custom object $obj=New-Object PSObject #assign properties $obj | Add-Member -MemberType Noteproperty -name "Name" -value $name $obj | Add-Member -MemberType Noteproperty -name "Password" -value $password $obj | Add-Member -MemberType Noteproperty -name "Size" -value $size $obj | Add-Member -MemberType Noteproperty -name "Server" -value $server #write the object to the pipeline $obj } #now we can use an object $var=Get-Better Write-Host "Creating $($var.name) on $($var.server)" -foregroundcolor CYAN #Now look what kind of value we get from $i $i=$var.size*4 $i Function Get-Best { Param([string]$name=$(Read-Host "Enter a name"), [Security.SecureString]$password=$(Read-Host "Enter a password" -asSecureString), [int]$size=1, [string]$server=$(Read-Host "Enter a server name") ) #create an empty custom object $obj=New-Object PSObject #assign properties $obj | Add-Member -MemberType Noteproperty -name "Name" -value $name $obj | Add-Member -MemberType Noteproperty -name "Password" -value $password $obj | Add-Member -MemberType Noteproperty -name "Size" -value $size $obj | Add-Member -MemberType Noteproperty -name "Server" -value $server #write the object to the pipeline $obj } #we can be prompted $var=Get-Best #Now look what kind of value we get from $i Write-Host "Creating $($var.name) on $($var.server)" -foregroundcolor CYAN $i=$var.size*4 $i #or we can specify some values Write-Host "Try again with some default values" -foregroundcolor CYAN $var=Get-Best -size 5 -server "FILE01" Write-Host "Creating $($var.name) on $($var.server) with a size of $($var.size)" -foregroundcolor CYAN