0

I'm trying to write some PowerShell code that takes an array of suffixes and builds a new array with an inputted string prefixed to those suffixes.

How can I do something like C#'s Map or aggregation code to build a new list based off the original list?

In the below powershell ...

$workspaceName = "test"
$deleteableItemSuffixes = @("-api","-asp","-appi")
$deleteableItemNames = ???

I want the resulting array to be ["test-api", "test-asp", "test-appi"], for example.

Ryan
  • 7,733
  • 10
  • 61
  • 106
  • Something like `$deleteableItemNames = $deleteableItemSuffixes | ForEach-Object { '{0}{1}' -f $workspaceName, $_ }` would do it – Theo Sep 29 '21 at 20:56

1 Answers1

2

The -replace operator allows for a concise and efficient solution for string arrays:

# Returns array @('test-api', 'test-asp', 'test-appi')
"-api", "-asp", "-appi" -replace '^', 'test'
  • -replace is regex-based and accepts arrays as input, in which case the operation is performed on each element.

  • ^ matches the position at the beginning of the string, at which the substitution string, 'test' is inserted, in effect prepending that string to each array element (by contrast, $ matches the end of each string and can be used to append a value).


For other data types and if you need more flexibility, you can use the .ForEach() array method (which, in the case of a collection that is already in memory, is faster than the ForEach-Object cmdlet):

("-api", "-asp", "-appi").ForEach({ 'test' + $_ })
  • Strictly speaking, what .ForEach() returns isn't a .NET array, but a collection of type [System.Collections.ObjectModel.Collection[psobject]], but the difference usually doesn't matter in PowerShell.

  • If you do need an actual array, you can simply cast the result:

    # Use the appropriate data type, or simply [array] for an [object[]] array.
    [string[]] ("-api", "-asp", "-appi").ForEach({ 'test' + $_ })
    
mklement0
  • 382,024
  • 64
  • 607
  • 775