РАЗДЕЛ
	about_Foreach

КРАТКОЕ ОПИСАНИЕ
	Описывает команду языка, позволяющую перебрать все элементы в 
	коллекции.


ПОЛНОЕ ОПИСАНИЕ
	Инструкция Foreach (называемая также циклом Foreach) является языковой 
	конструкцией для пошагового перемещения (итерации) по последовательности 
	значений в коллекции элементов. 


	Самым простым и наиболее часто используемым типом коллекции, по 
	которой производится перемещение, является массив. Обычно в цикле 
	Foreach одна или несколько команд выполняются на каждом элементе массива. 


  Синтаксис	
	Ниже показан синтаксис инструкции Foreach:

	
		foreach ($<элемент> in $<коллекция>){<список_инструкций>}


  Инструкция Foreach за пределами конвейера команд В заключаемой в круглые 
  скобки части инструкции Foreach указываются переменная и коллекция для перебора. 
  При выполнении цикла Foreach среда Windows PowerShell автоматически создает переменную 
  ($<элемент>). Перед каждой итерацией в цикле переменной присваивается значение в коллекции. 
  Блок за инструкцией Foreach {<список_инструкций>} содержит набор команд, выполняемых на 
  каждом элементе коллекции.
 

  Примеры
	Например, цикл Foreach в следующем примере отображает значения 
	в массиве $letterArray.

	
		$letterArray = "a","b","c","d"
		foreach ($letter in $letterArray)
		{
			Write-Host $letter
	}


	В этом примере создается массив $letterArray, который затем 
	инициализируется строковыми значениями "a", "b", "c" и "d". При первом 
	выполнении инструкции Foreach переменная $letter устанавливается 
	равной первому элементу в массиве $letterArray ("a"). Затем буква "a" 
	отображается с помощью командлета Write-Host. При следующей итерации цикла 
	переменной $letter присваивается значение "b" и т. д. После того как цикл 
	Foreach отобразит букву "d", Windows PowerShell выходит из цикла.


	Инструкция Foreach должна представляться в одной строке 
	целиком, чтобы она выполнялась как команда в командной строке 
	Windows PowerShell. Инструкция Foreach не обязательно должна 
	представляться в одной строке целиком, если команда помещается 
	в файл скрипта PS1. 


	Инструкции Foreach могут также использоваться совместно с 
	командлетами, возвращающими коллекции элементов. В следующем примере 
	инструкция Foreach выполняет перебор элементов списка, возвращаемого 
	командлетом Get-ChildItem.


		foreach ($file in Get-ChildItem)
		{
			Write-Host $file
	}


	Пример может быть усовершенствован при помощи инструкции If для 
	ограничения возвращаемых результатов. В следующем примере инструкция 
	Foreach выполняет те же операции в цикле, что и в предыдущем примере, 
	но здесь добавлена инструкция If, ограничивающая результаты файлами, 
	размер которых превышает 100 килобайт (КБ).


		foreach ($file in Get-ChildItem)
		{
			if ($file.length -gt 100k) 
			{
				Write-Host $file
		}
	}


	В этом примере цикл Foreach использует свойство переменной $file для 
	выполнения операции сравнения ($file.length -gt 100k). Переменная 
	$file содержит все свойства в объекте, возвращаемом командлетом 
	Get-ChildItem. Поэтому может возвращаться не только имя файла. 
	В следующем примере Windows PowerShell внутри списка инструкций 
	возвращает длину и время последнего обращения:


		foreach ($file in Get-ChildItem)
		{
			if ($file.length -gt 100k) 
			{
				Write-Host $file
				Write-Host $file.length
				Write-Host $file.lastaccesstime }
	}


	В этом примере в списке инструкций не обязательно выполнять 
	только одну команду. 


	Кроме того, можно использовать переменную вне цикла Foreach и 
	увеличивать ее значение внутри цикла. Следующий пример 
	подсчитывает файлы, размер которых превышает 100 КБ: 

  
		$i = 0
		foreach ($file in Get-ChildItem)
		{
			if ($file.length -gt 100k) 
			{
				Write-Host $file "file size:" ($file.length / 
		1024).ToString("F0") KB
				$i = $i + 1
		}
	}

		if ($i -ne 0)
		{
			Write-Host
			Write-Host $i " file(s) over 100 KB in the current 
		directory."}
		else 
		{
			Write-Host "No files greater than 100 KB in the current 
		directory."
	}


	В предыдущем примере переменной $i присваивается значение 0 вне 
	цикла, а увеличение значения происходит внутри цикла для каждого 
	найденного файла размером больше 100 КБ. При выходе из цикла инструкция 
	If вычисляет значение переменной $i для отображения количества всех 
	файлов размером более 100 КБ. Либо отображается сообщение о том, 
	что ни одного файла размером более 100 КБ не найдено.


	Предыдущий пример также демонстрирует, как форматировать 
	результаты для длины:


		($file.length / 1024).ToString("F0")


	Значение делится на 1024, чтобы показать результаты в 
	килобайтах, а не в байтах. Полученное значение далее 
	форматируется при помощи спецификатора формата с фиксированной 
	запятой для удаления из результата дробной части. Значение 0 
	спецификатора формата указывает, что дробная часть отображаться 
	не должна. 


  Инструкция Foreach внутри конвейера команд Когда инструкция Foreach 
  используется в конвейере команд, Windows PowerShell использует псевдоним 
  foreach, вызывающий команду ForEach-Object. При использовании псевдонима 
  foreach в конвейере команд не используется синтаксическая конструкция 
  ($<элемент> in $<коллекция>), как это делается с инструкцией Foreach. 
  Это является следствием того, что эти сведения предоставляет предыдущая 
  команда в конвейере. Синтаксис псевдонима foreach, применяемого в 
  конвейере команд, выглядит следующим образом:
	

		<команда> | foreach {<блок_команд>}
	 

	Например, цикл Foreach в следующем конвейере команд отображает все 
	процессы, рабочий набор (использование памяти) которых превышает 20 
	мегабайт (МБ). Оболочка Windows PowerShell передает выходные данные 
	команды Get-Process по конвейеру псевдониму foreach. Внутри блока 
	команд псевдонима foreach переменная $_.WS содержит значение свойства 
	WS (рабочего набора), передаваемое ей командлетом Get-Process. 
	(Часть $_ объявления является автоматической переменной WSH, а часть 
	WS является свойством.) Инструкция If использует условное выражение для 
	определения того, превышает ли рабочий набор 20 МБ (20 000 000 байт). 
	Если превышает, то отображаются имя процесса, хранящееся в переменной 
	$_.name, и размер рабочего набора в мегабайтах. При отсутствии рабочего 
	набора процесса, размер которого превышает 20 МБ, ничего не отображается.


		Write-Host "Processes with working-sets greater than 20 MB"
		Get-Process | foreach { 
			if ($_.WS -gt 20m)
			{
				Write-Host $_.name ": " 
		($_.WS/1m).ToString("F0") MB -Separator ""
		}
	}

	Кроме того, псевдоним foreach поддерживает понятия начального блока 
	команд, среднего блока команд и конечного блока команд. Начальный и 
	конечный блоки команд выполняются один раз, а средний блок команд 
	выполняется каждый раз, когда цикл Foreach перемещается к очередному 
	элементу коллекции или массива. 
	

	Синтаксис псевдонима foreach, используемого в конвейере команд с 
	начальным, средним и конечным блоками команд выглядит следующим образом:
	

		<команда> | foreach {<начальный_блок_команд>}
		{<средний_блок_команд>}{<конечный_блок_команд>}

 
	В следующем примере демонстрируется использование начального, 
	среднего и конечного блоков команд. 


		Get-ChildItem | foreach {
		$fileCount = $directoryCount = 0}{
		if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{ 
		"$directoryCount directories and $fileCount files"}


	Начальный блок создает и инициализирует две переменных со 
	значением 0:


		{$fileCount = $directoryCount = 0}
 

	Средний блок проверят, является ли возвращаемый командлетом 
	Get-ChildItem элемент каталогом или файлом:


		{if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}


	Если возвращаемый элемент является каталогом, значение переменной 
	$directoryCount увеличивается на 1. Если элемент не является 
	каталогом, на 1 увеличивается значение переменной $fileCount. 
	Конечный блок выполняется после того, как средний блок завершит 
	цикл и вернет результат операции: 

	 
		{"$directoryCount directories and $fileCount files"}


	При помощи структуры начального, среднего и конечного блоков и 
	оператора конвейера можно переписать приведенный выше пример 
	поиска файлов размером более 100 КБ следующим образом:


		Get-ChildItem | foreach{
			$i = 0}{
			if ($_.length -gt 100k)
			{
				Write-Host $_.name "file size:" ($_.length / 
		1024).ToString("F0") KB
				$i++
		}
		}{
			if ($i -ne 0)
			{
				Write-Host
				Write-Host "$i file(s) over 100 KB in the current 
		directory."
		}
			else 
			{
			Write-Host "No files greater than 100 KB in the current 
		directory."}
		}


СМ. ТАКЖЕ
	about_Automatic_Variables
	about_If
	Foreach-Object