Ok, this one is perhaps a little silly, but have you ever struggled with writing output involving an integer with an unknown value together with some text? Don’t know what I’m talking about? I don’t blame you!
I mean this kind of output:
1 file processed
2 files processed
0 files processed
125 files processed
The easy way out would be to write something like this:
Write-Output "$int files processed"
This would mean that for int = 1, the output will be “1 files processed”, but hey – who cares right? I have tried using an if-statement to get the desired result, and while it works, the code don’t look pretty.
So I thought I’d take the time to write a proper function for this. I decided to write a full advanced function, which means that it might feel a bit bloated, but luckily copy/paste don’t care about number of lines.
Anyway, here is the code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Write-PluralString{ | |
<# | |
.SYNOPSIS | |
Write string with built-in handling of plural-s for variable integer. | |
.DESCRIPTION | |
Write string with built-in handling of plural-s for variable integer. | |
.EXAMPLE | |
Write-PluralString "$($computer): " $num 'file' 'processed' | |
.EXAMPLE | |
Write-Verbose (Write-PluralString "$($computer): " $num 'file' 'processed') | |
.EXAMPLE | |
Write-PluralString '' $num 'file' $processed | |
Omitting the PreString | |
.NOTES | |
Name: Write-PluralString | |
Author: Øyvind Kallstad | |
Created: 18.08.2014 | |
Version: 1.0 | |
#> | |
[CmdletBinding()] | |
param ( | |
# Define a starting string. | |
[Parameter(Position = 0, Mandatory = $false)] | |
[string]$PreString, | |
# Integer that will be used as part of the string, and will decide if the StringPart should include the plural-s or not. | |
[Parameter(Position = 1, Mandatory = $true)] | |
[int]$IntPart, | |
# String that will display with or without 's' based on value of the integer before it | |
[Parameter(Position = 2, Mandatory = $true)] | |
[ValidateNotNullorEmpty()] | |
[string]$StringPart, | |
# Define a string to display at the end. | |
[Parameter(Position = 3, Mandatory = $false)] | |
[string]$PostString | |
) | |
Write-Output "$(@{$false="$($PreString) "}[[System.String]::IsNullOrWhiteSpace($PreString)])$($IntPart) $(@{$true = $StringPart; $false = "$($StringPart)s"}[$IntPart -eq 1]) $($PostString)" | |
} |