Summary: Microsoft Scripting Guy, Ed Wilson, talks about creating a Windows PowerShell function that counts a string length and copies it to the clipboard.
Microsoft Scripting Guy, Ed Wilson, is here. It is hot and humid outside—89 degrees Fahrenheit (32 degrees Celsius) and 75% humidity. That was the great thing about Madrid. Whereas, it was a little hotter (92 degrees Fahrenheit, 33 degrees Celsius), the humidity was less than half the amount we have in Charlotte, North Carolina. The Scripting Wife and I are soaked following a quick trip to the library—and we were not even running. I am sipping a cup of Oolong Green Tea with a bit of cinnamon stick and rose hips. Believe it or not, hot tea on a hot summer day is great. It makes me feel cooler.
My personal criteria for writing a Windows PowerShell script or a Windows PowerShell function is: when a task becomes annoying to me, I spend the time to create a function or a script. At times, the scenario is not all that bad, but eventually it becomes annoying. Today’s function provides such an example. I need to determine the character length of the title for my Hey, Scripting Guy! Blog. To do this, I have been opening Notepad and using the word count feature there. Then I copy the text to the clipboard, close Notepad, and paste it into Word 2013. So here are the steps involved:
- Open Notepad.
- Type the title.
- Note the number of characters.
- Copy the title to the clipboard.
- Select the entire text.
- Type Ctrl-C.
- Close Notepad.
- Paste the title into Word 2013.
When I list out the number of steps, it seem like a lot of work, but in reality it takes only a minute or two to accomplish. Hmmm…with 730 Hey, Scripting Guy! Blog posts a year, at two minutes each…
That equals 24.5 hours of work! My new function allows me to accomplish this in less than 15 seconds. Therefore, I save 18.3 hours a year. That is not a bad ROI for a function that took me less than 20 minutes to write.
Creating a function to count letters and copy to the clipboard
So I decided to create a function to count the characters in a string. I am going to add the function to my personal profile so it will always be available.
Start with a function outline
The first thing I do is begin with a function outline as shown here:
Function
{
}
Now I need to decide on the name. I always want to use an approved verb. This is easy, because there is the Get-Verb command. At first, I was thinking Count. But when I used the command shown here, there is no Count as an approved verb.
PS C:\> get-verb count
PS C:\>
So this means I will use the verb Get and then add something descriptive. I came up with Get-LetterCount. My function outline now looks like this:
Function Get-LetterCount
{
} # End Function Get-LetterCount
Add the function parameter
Now I need to add a parameter that I will use for input. I cast the input as a string because that is the way I anticipate using the function. Here is the Paramstatement:
Param ([string]$string)
The cool thing is that a string automatically has a Lengthproperty so getting the information will be really easy. I want to display the output to the console. I use the Write-Host cmdlet to do this, as shown in this line of code:
Write-Host -ForegroundColor Cyan "string length is" $string.Length
Now, I need to copy the string input to the clipboard. To do this, I use the Clip.execommand. This is easy. Here is the code:
$string | clip.exe
The completed function is shown here:
Function Get-LetterCount
{
Param ([string]$string)
Write-Host -ForegroundColor Cyan "string length is" $string.Length
$string | clip.exe
} # End Function Get-LetterCount
Clean up and make things more usable
I do not want to have to type Get-LetterCount each time I want to use the function. Therefore, I create a really short alias—I mean really short. The letter C. I use Set-Alias instead of New-Alias so that it will overwrite. This is important during testing. It is also something I need to do to ensure that I do not overwrite another alias. Therefore, I use the Get-Alias command first. This is shown here:
PS C:\> Get-Alias c
Get-Alias : This command cannot find a matching alias because an alias with the
name 'c' does not exist.
At line:1 char:1
+ Get-Alias c
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (c:String) [Get-Alias], ItemNotFoundE
xception
+ FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.G
etAliasCommand
Cool. Now I can add my new alias as shown here:
Set-Alias -Name c -Value Get-LetterCount
Now I add comment-based Help to the function. This takes me less than 60 seconds because I use my Add-Help function from my Windows PowerShell profile module.
Note For more information about my Windows PowerShell profile module, see Add Power and Functionality to the PowerShell ISE Part 2.
Here is the comment-based Help:
<#
.Synopsis
This counts letters in a string
.Description
This function counts letters in a string
.Example
Get-LetterCount "this is a string
Returns string length is 16 and copies text to clipboard
.Parameter String
The input as a string
.Notes
NAME: Get-LetterCount
AUTHOR: ed wilson, msft
LASTEDIT: 07/03/2013 12:33:28
KEYWORDS: Scripting Techniques, String Manipulation, Functions
HSG: HSG-7-10-13
.Link
Http://www.ScriptingGuys.com
#Requires -Version 2.0
#>
Note For more information about adding comment-based Help, see Automatically Add Comment-Based Help to your PowerShell Scripts.
Using the Get-LetterCount function
I add the Get-LetterCount function and the alias to my Windows PowerShell ISE profile. I can run the function from inside the ISE or dot source it in the Windows PowerShell console. After the function loads and the alias is created, I use the alias and pass the string as shown here:
PS C:\> c "A PowerShell Function to count string length"
string length is 44
When I call the function, I use the Get-Clipboard cmdlet (from the PSCX module) to verify that my string is indeed on the clipboard. This is shown here:
I can now paste my tile into my Word document. Cool! Now, I need to decide what I will do with the two days I have saved with this function.
The complete script is uploaded to the Script Center Repository: Get String Letter Count Function.
That is all there is to creating a Windows PowerShell function to count string length and copy the string to the clipboard. Join me tomorrow when I will talk about more cool Windows PowerShell stuff.
I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.
Ed Wilson, Microsoft Scripting Guy