В Powershell Почему цикл foreach-object не позволяет извлекать отдельные значения из массива?

Обратите внимание на следующий вывод. $Names — это массив с двумя значениями. $Machinename — это массив с двумя значениями.

Их позиционные значения в массиве точно извлекаются вне цикла foreach. При извлечении в цикле foreach значение, запрошенное для первой позиции в массиве, т.е. $Names[0], игнорирует позиционный вызов [0]...... Мне нужно иметь возможность получить это значение само по себе.... , В конечном итоге мне нужно будет взаимодействовать с каждым значением для ввода команды...

PS C:\Users\lab> $Names

john
jeff
PS C:\Users\lab> $Names[0]

john
PS C:\Users\lab> $Names[1]

jeff
PS C:\Users\lab> $Machinename

dev1
dev2
PS C:\Users\htlab> $Machinename | ForEach-Object  { Write-Output "$Names[0]"}

john jeff[0]
john jeff[0]

Пример сценария:

$Names = 'john', 'jeff'
$machinename = 'dev1', 'dev2'
$Machinename | ForEach-Object  {Write-Output "$Names[0]"}

person Jryan    schedule 28.01.2021    source источник
comment
Это связано с двойными кавычками " — процедура раскрытия строк в PowerShell не распознает сложные выражения. $Machinename | ForEach-Object {Write-Output $Names[0]} будет работать нормально   -  person Mathias R. Jessen    schedule 28.01.2021
comment
Этот ответ на связанный дубликат содержит подробное объяснение, но вкратце: внутри "...", если вы хотите сослаться на выражение, которое выходит за рамки простой ссылки на переменную (например, $var), ее необходимо заключить в $(...) (например, $($var[0]))   -  person mklement0    schedule 28.01.2021
comment
Спасибо. Это ответило на непосредственный вопрос и помогло мне понять, как достичь моей более поздней цели. Дал мне рыбу, удочку и ноу-хау!   -  person Jryan    schedule 28.01.2021


Ответы (2)


Вы не оцениваете массив. Написание "$Names[0]" эквивалентно $Names + "[0]".

Вам нужно вложить оценку внутрь $(...).

Попробуй это:

$Machinename | ForEach-Object  {Write-Output "$($Names[0])"}

Это дает мне:

john
john

В равной степени, как указано в комментариях, это тоже работает:

$Machinename | ForEach-Object  {Write-Output $Names[0]}
person Enigmativity    schedule 28.01.2021
comment
Спасибо, что объяснили, что на самом деле происходит. Знание этого на самом деле дало мне представление о том, когда я мог бы использовать что-то подобное, когда я действительно хочу такого поведения. - person Jryan; 28.01.2021

Вы можете попробовать что-то вроде этого, мне показалось, что это сработало, если только это не то, о чем вы спрашиваете,

for (($i = 0); $i -lt $names.Count; $i++)
{
 $Names[$i] + ":" + $Machinename[$i]
}

Вывод:

John:dev1
Jeff:dev2
person Brnsn    schedule 28.01.2021
comment
Это не отвечает на вопрос. Это может дать OP желаемый результат, но конкретный вопрос: почему цикл foreach-object не позволяет вам извлекать отдельные значения из массива? - person Enigmativity; 28.01.2021
comment
@Enigmativity достаточно честно! - person Brnsn; 28.01.2021
comment
Спасибо за синтаксис инкремента, хотя он не отвечает на мой непосредственный вопрос, поскольку я новичок в этом, он обязательно будет полезен для одной из моих других задач автоматизации. - person Jryan; 28.01.2021