Войти

Показать полную графическую версию : Проблема с циклом


tuguror
17-09-2015, 00:28
Доброе время суток форумчане.
Попрошу знающих powershell решить такую проблему
Есть две переменные $a и $b , обе массивы
Нужно передать переменную счетчика в цикле Foreach $i сразу двум переменным $a и $b.
Я пробовал иForeach ($i in $a,$b)
и
Foreach ($i in $a, $i in $b)
Но конечно ничего не получилось. Как это реализовать ?

Iska
17-09-2015, 01:28
Нужно передать переменную счетчика в цикле Foreach $i сразу двум переменным $a и $b. »
Я теряюсь в догадках по двум причинам: а) само высказывание некорректно и б) какова Ваша цель, чего Вы хотите этим добиться?

Если хотите перебрать элементы, одновременно обращаясь к элементам обоих массивов сразу, так:
$a = 0, 1, 2, 3, 4
$b = 5, 6, 7, 8, 9

for ($i = 0; $i -le ($a.length - 1); $i += 1) {
Write-Host $a[$i], $b[$i]
}

Для корректной работы размеры массивов должны быть идентичны.

Foreigner
17-09-2015, 08:05
У меня работает (powershell 5.0)

$a = 1,2,3
$b = 4,5,6

foreach ($i in $a,$b) { $i }
1
2
3
4
5
6

Kazun
17-09-2015, 08:33
Переменная $i содержит массив, поэтому можно создать вложенный цикл.
$a = 1,2,3
$b = 4,5,6
foreach ($i in $a,$b) { $i.GetType() }

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
True True Object[] System.Array


PS > foreach ($i in $a,$b) { $i+1}
1
2
3
1
4
5
6
1


Добавим доп. foreach:

foreach ($i in $a,$b) { foreach ($y in $i) {$y.GetType()}}

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
True True Int32 System.ValueType
True True Int32 System.ValueType
True True Int32 System.ValueType
True True Int32 System.ValueType
True True Int32 System.ValueType

PS > foreach ($i in $a,$b) { foreach ($y in $i) {$y+1}}
2
3
4
5
6
7

Iska
17-09-2015, 11:52
У меня работает (powershell 5.0) »
У меня под 2.0 тоже :). Но потребность автора всё одно не понял.

Foreigner
17-09-2015, 12:55
Iska, Да, нужно ждать пояснения, что такое переменная счетчика цикла

tuguror
17-09-2015, 15:23
Большое спасибо всем кто ответил. Извиняюсь что сразу не озвучил свои намерения. Есть доменная сеть. Нужно из сервера копировать файлы на рабочий стол пользователей. Одна из переменных $a обращается к текстовому файлу с компьютерами, другая $b к файлу с пользователями. Так как на одной машине несколько доменных пользователей то и списки разные. Вот этот скрипт
[CODE][
$a = Get-Content "E:\bat\Host.txt"
$b = Get-Content "E:\bat\User.txt"
foreach ($i in $a, $b)
{
invoke-command -computername $a -scriptblock {Copy-Item '\\server\share\file.doc ' -Destination 'C:\Documents and Settings\$b\Рабочий стол' -force }
}
/CODE]
Поэтому я спрашивал как сделать в цикле foreach та чтобы счетчик $i обращался за один раз к двум переменным $a и $b

Iska
17-09-2015, 17:39
Поэтому я спрашивал как сделать в цикле foreach та чтобы счетчик $i обращался за один раз к двум переменным $a и $b »
Никак, поскольку бессмысленно.

Делайте два вложенных цикла. Первый — по перечню машин, второй, вложенный в него — по перечню учётных записей. Наподобие (болванка, не проверялось):
$a = Get-Content "E:\bat\Host.txt"
$b = Get-Content "E:\bat\User.txt"

foreach ($i in $a) {
foreach ($j in $b) {
invoke-command -computername $i -scriptblock {
Copy-Item '\\server\share\file.doc ' -Destination 'C:\Documents and Settings\$j\Рабочий стол' -Force
}
}
}

tuguror
19-09-2015, 17:39
Спасибо вам всем. Я посмотрел ваши замечания и буду пробовать ваши скрипты




© OSzone.net 2001-2012