Update: better yet, read about the -Join and -Split PowerShell operators. Live and learn.
—Geoff
Something I’ve found myself missing in PowerShell is a function to combing the elements of a list with a given separator, like Perl’s join() function. I finally got annoyed enought to write one. It seems to do what I want, so I’m going to add it to my profile.
Here it is in action:
PS C:\>
$array
= 3.14,
'Puppy'
,
$false
,
''
,
'Green'
,
$null
,
'foo'
PS C:\>
$array
|
Join-String
3.14,Puppy,False,,Green,,foo
PS C:\>
$array
|
Join-String
-collapse
3.14,Puppy,Green,foo
PS C:\>
$array
|
Join-String
-collapse
' - '
3.14 - Puppy - Green - foo
Update: Now supports list items as parameter (non-pipeline) usage:
PS C:\>
$y
=
Join-String
$array
-collapse
PS C:\>
$y
3.14,Puppy,False,Green,foo
PS C:\>
$y
.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Here’s the code:
1234567891011121314151617181920212223242526272829303132333435363738# Join-String - A simple pipeline-oriented function to
# concatenate a bunch of strings together with a separator
# Geoffrey.Duke@uvm.edu Wed 11/17/2010
# updated 11 July 2013 to handle non-pipeline usage
function
Join-String
(
[string[]]
$list
,
[string]
$separator
=
','
,
[switch]
$Collapse
)
{
[string]
$string
=
''
$first
=
$true
# if called with a list parameter, rather than in a pipeline...
if
(
$list
.count
-ne
0 ) {
$input
=
$list
}
foreach
(
$element
in
$input
) {
#Skip blank elements if -Collapse is specified
if
(
$Collapse
-and
[string]
::IsNullOrEmpty(
$element
) ) {
continue
}
if
(
$first
) {
$string
=
$element
$first
=
$false
}
else
{
$string
+=
$separator
+
$element
}
}
write-output
$string
}
If you have a notion for how it could be improved, please comment.