I am trying to get the first char of each string in a List. The list contains:
hehee_one
hrhr_one
test_two
I am using a foreach-object to loop the list
ForEach-Object {($jsonRules.name[0])}
But what this does is getting only the first element, which makes sense. and if i do this:
ForEach-Object {($jsonRules.name[0][0])}
I only get the first char of the first element but not the rest..
so please help me.. thank you
CodePudding user response:
Santiago Squarzon provided the crucial pointer in a comment:
Provide the strings you want the ForEach-Object cmdlet to operate on via the pipeline, which allows you to refer to each via the automatic $_ variable (the following uses an array literal as input for brevity):
PS> 'tom', 'dick', 'harry' | ForEach-Object { $_[0] }
t
d
h
Alternatively, for values already in memory, use the .ForEach array method for better performance:
('tom', 'dick', 'harry').ForEach({ $_[0] })
The foreach statement provides the best performance:
foreach ($str in ('tom', 'dick', 'harry')) { $str[0] }
As for what you tried:
ForEach-Object { ... }- without pipeline input - is essentially the same as executing...directly.Thus, expressed in terms of the sample input above:
You executed:
ForEach-Object { ('tom', 'dick', 'harry')[0][0] }which is the same as:
('tom', 'dick', 'harry')[0][0]which therefore extracts the first element from the input array (the first
[0]) and then applies the second[0]to that string only, and therefore only yields't'.
In other words: use of
ForEach-Objectonly makes sense with input from the pipeline.
