tl;dr:
Preferably, pass the paths array directly to the (implied) -Path parameter:
$arr = 'c:\one', 'c:\two'
# Positional use of $arr implies -Path
New-Item $arr -ItemType Directory
Alternatively, via the pipeline and a script-block parameter value:
$arr = 'c:\one', 'c:\two'
$arr | New-Item -Path { $_ } -ItemType Directory
With directory names and their shared parent path specified separately:
$arr = 'one', 'two'
$arr | New-Item -Name { $_ } -ItemType Directory -Path C:\
If you do not specify a parameter name, New-Item binds the 1st positional argument to the -Path parameter.
Therefore,
new-item "c:\newdir" -itemtype directory
is the same as:
new-item -Path "c:\newdir" -itemtype directory
New-Item -? will tell you that -Path accepts an array of strings:
New-Item [-Path] <String[]> ...
Therefore, you don't even need the pipeline and can just pass your array of paths directly:
New-Item 'c:\one', 'c:\two' -ItemType Directory
Several of New-Item's parameters accept pipeline input, and the only one that accepts input by value (input object as-is) is -Value, which doesn't
help here.
The remaining pipeline-binding parameters require binding by property name matching the parameter name.
To determine which parameters accept pipeline input, run Get-Help -full New-Item and search for instances of string Accept pipeline input? True. This approach works with all cmdlets.
Thus, in order to bind to parameter -Path, the input objects must have .Path properties:
$arr = [pscustomobject] @{ Path = 'c:\one' }, [pscustomobject] @{ Path = 'c:\two' }
$arr | New-Item -ItemType Directory
However, given that any pipeline-binding parameters can take script blocks as parameter values that are evaluated for each input object, this can be simplified to:
$arr = 'c:\one', 'c:\two'
$arr | New-Item -Path { $_ } -ItemType Directory
Automatic variable $_ reflects the pipeline object at hand, which in this case are the input strings in turn.
A - partially outdated - explanation of this approach can be found here; nowadays, the approach works
solely with parameters that are designed to take pipeline input in principle.
The command at the top with -Name { $_ } and -Path C:\ - specifying the names separately from the shared parent path - works analogously.
As for what you tried:
-Name accepts directory names only; only -Path accepts paths.
Trying to bind the input paths to -Name results in error message:
The given path's format is not supported.
because the input paths contain characters such as : and \ that cannot be part of a directory / file name.
{$_}looks like it should be${_}, but it is - and is meant to be - a script-block argument, that effectively binds each input object passed through the pipeline as-is to the specified parameter. A - partially outdated - explanation of this approach can be found here; nowadays, the approach only works with parameters that are designed to take pipeline input in principle.