как понять цикл foreach в powershell

#powershell

#powershell

Вопрос:

Привет всем, я новичок в power shell и пытаюсь разобраться в каждом цикле, но я не понимаю, что означает $ в приведенном ниже сценарии и почему они используются вместе

 $names = "jones","mike","Ash"
foreach ($name in $names)
{
    "$name = "   $name.length
}
  

Комментарии:

1. Я только что скопировал этот скрипт из Google, но пытаюсь разобраться в цикле for. Что такое $name для каждого цикла, я в замешательстве, потому что переменная, которую мы объявили, равна $names

Ответ №1:

Прежде всего, это PowerShell. Здесь нет пробела и соблюдайте заглавные буквы.

Во-вторых, RTFM. В Technet есть много документации. Воспользуйтесь этим. Есть встроенная справка. Прочитайте Help about_* темы.

Возвращаясь к вашему вопросу, foreach цикл повторяется по всей коллекции. В вашем примере $names представляет собой массив строк. Массив — это коллекция.

В вашем примере, когда foreach цикл выполняет итерацию по коллекции, он копирует каждый элемент в коллекции в другую вызываемую переменную $name .

 foreach ($name in $names) {}
  

Внутри foreach цикла вы можете использовать $name переменную для извлечения значения, хранящегося в элементе. Итак, следующий код выведет значения в коллекции.

 foreach ($name in $names) {
    $name
}
  

$name является строкой. Итак, $name.Length дает нам длину этой строки.

является арифметическим оператором. Его можно использовать для объединения строк. В этом случае $name $name.length к значению будет добавлено значение length.

Вот измененный пример с выводом:

 $names = "jones","mike","Ash"
foreach ($name in $names)
{
    $name   $name.Length
}

jones5
mike4
Ash3
  

Наконец, перейдем к вашему примеру и результату:

 $names = "jones","mike","Ash"
foreach ($name in $names)
{
    "$name = "   $name.Length
}

jones = 5
mike = 4
Ash = 3
  

Я надеюсь, что это дает вам некоторое объяснение того, что делает пример.

Ответ №2:

Давайте рассмотрим это шаг за шагом:

 $names = "jones","mike","Ash"
  

Это объявляет массив с тремя строковыми элементами и сохраняет его в переменной $names.

 foreach ($name in $names) { }
  

Это цикл, который перебирает все элементы в переменной массива $names. Каждый элемент «копируется» в переменную «$name», поэтому, когда вы работаете с $name , вы работаете с текущим элементом в цикле.

 "$name = "   $name.length
  

Это выводит содержимое переменной $name и свойство «length» объекта, представленного $name. Если вы помните, мы объявили массив строковых элементов, другими словами, строковых объектов. Объекты Strings имеют свойства и методы, одним из таких свойств является length свойство, которое указывает длину строки.

Однако обозначение немного странное. В PowerShell переменные, встроенные в строковые литералы (например, "start $name end" , будут заменены их строковым значением, поэтому "start $name end" станут start jones end для первого элемента. Однако вы не можете просто написать "start $name.length end" , поэтому в этом примере автор использовал для объединения (добавления) двух строк. Альтернативным решением этого было бы "$name = $($name.length))" : таким образом, один строковый литерал будет содержать как строку, так и ее свойство length.