-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSplit-StringOnLiteralString.ps1
114 lines (102 loc) · 5.93 KB
/
Split-StringOnLiteralString.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
function Split-StringOnLiteralString {
# Split-StringOnLiteralString is designed to split a string the way the way that I
# expected it to be done - using a literal string (as opposed to regex). It's also
# designed to be backward-compatible with all versions of PowerShell and has been
# tested successfully on PowerShell v1. My motivation for creating this function
# was 1) I wanted a split function that behaved more like VBScript's Split
# function, 2) I did not want to be messing around with RegEx, and 3) I needed code
# that was backward-compatible with all versions of PowerShell.
#
# This function takes two positional arguments
# The first argument is a string, and the string to be split
# The second argument is a string or char, and it is that which is to split the string in the first parameter
#
# Note: This function always returns an array, even when there is zero or one element in it.
#
# Example:
# $result = Split-StringOnLiteralString 'foo' ' '
# # $result.GetType().FullName is System.Object[]
# # $result.Count is 1
#
# Example 2:
# $result = Split-StringOnLiteralString 'What do you think of this function?' ' '
# # $result.Count is 7
#region License ################################################################
# Copyright 2023 Frank Lesniak
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in the
# Software without restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
# Software, and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#endregion License ################################################################
#region DownloadLocationNotice #################################################
# The most up-to-date version of this script can be found on the author's GitHub
# repository at https://github.com/franklesniak/PowerShell_Resources
#endregion DownloadLocationNotice #################################################
$strThisFunctionVersionNumber = [version]'2.0.20230708.0'
trap {
Write-Error 'An error occurred using the Split-StringOnLiteralString function. This was most likely caused by the arguments supplied not being strings'
}
if ($args.Length -ne 2) {
Write-Error 'Split-StringOnLiteralString was called without supplying two arguments. The first argument should be the string to be split, and the second should be the string or character on which to split the string.'
$result = @()
} else {
$objToSplit = $args[0]
$objSplitter = $args[1]
if ($null -eq $objToSplit) {
$result = @()
} elseif ($null -eq $objSplitter) {
# Splitter was $null; return string to be split within an array (of one element).
$result = @($objToSplit)
} else {
if ($objToSplit.GetType().Name -ne 'String') {
Write-Warning 'The first argument supplied to Split-StringOnLiteralString was not a string. It will be attempted to be converted to a string. To avoid this warning, cast arguments to a string before calling Split-StringOnLiteralString.'
$strToSplit = [string]$objToSplit
} else {
$strToSplit = $objToSplit
}
if (($objSplitter.GetType().Name -ne 'String') -and ($objSplitter.GetType().Name -ne 'Char')) {
Write-Warning 'The second argument supplied to Split-StringOnLiteralString was not a string. It will be attempted to be converted to a string. To avoid this warning, cast arguments to a string before calling Split-StringOnLiteralString.'
$strSplitter = [string]$objSplitter
} elseif ($objSplitter.GetType().Name -eq 'Char') {
$strSplitter = [string]$objSplitter
} else {
$strSplitter = $objSplitter
}
$strSplitterInRegEx = [regex]::Escape($strSplitter)
# With the leading comma, force encapsulation into an array so that an array is
# returned even when there is one element:
$result = @([regex]::Split($strToSplit, $strSplitterInRegEx))
}
}
# The following code forces the function to return an array, always, even when there are
# zero or one elements in the array
$intElementCount = 1
if ($null -ne $result) {
if ($result.GetType().FullName.Contains('[]')) {
if (($result.Count -ge 2) -or ($result.Count -eq 0)) {
$intElementCount = $result.Count
}
}
}
$strLowercaseFunctionName = $MyInvocation.InvocationName.ToLower()
$boolArrayEncapsulation = $MyInvocation.Line.ToLower().Contains('@(' + $strLowercaseFunctionName + ')') -or $MyInvocation.Line.ToLower().Contains('@(' + $strLowercaseFunctionName + ' ')
if ($boolArrayEncapsulation) {
$result
} elseif ($intElementCount -eq 0) {
, @()
} elseif ($intElementCount -eq 1) {
, (, ($args[0]))
} else {
$result
}
}