Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проблема с циклом (http://forum.oszone.net/showthread.php?t=305531)

tuguror 17-09-2015 00:28 2554105

Проблема с циклом
 
Доброе время суток форумчане.
Попрошу знающих 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 2554115

Цитата:

Цитата tuguror
Нужно передать переменную счетчика в цикле 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 2554145

У меня работает (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 2554152

Переменная $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 2554254

Цитата:

Цитата Foreigner
У меня работает (powershell 5.0) »

У меня под 2.0 тоже :). Но потребность автора всё одно не понял.

Foreigner 17-09-2015 12:55 2554295

Iska, Да, нужно ждать пояснения, что такое переменная счетчика цикла

tuguror 17-09-2015 15:23 2554366

Большое спасибо всем кто ответил. Извиняюсь что сразу не озвучил свои намерения. Есть доменная сеть. Нужно из сервера копировать файлы на рабочий стол пользователей. Одна из переменных $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 2554424

Цитата:

Цитата tuguror
Поэтому я спрашивал как сделать в цикле 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 2555209

Спасибо вам всем. Я посмотрел ваши замечания и буду пробовать ваши скрипты


Время: 21:46.

Время: 21:46.
© OSzone.net 2001-