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

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

rudimko 25-06-2013 10:28 2173812

Обработка коллекции через foreach ()
 
Давно не брался за PS, все подзабыл.

Создаю коллекцию:
$A = @{
"123" = "цифры";
"абв" = "буквы";
"-=?" = "знаки";
}

Вот как перебрать $Key in $A.Keys и $Value in $A.Values разом?
Пытаюсь делать через foreach () {}, выходит какае-то чепуха. Точнее, ничего не выходит.

Заранее спасибо.

Iska 25-06-2013 14:08 2173934

rudimko, непонятно, чего Вы хотите. Что значит — «в одном цикле сразу»? Зачем тут вообще цикл?

rudimko 25-06-2013 14:24 2173951

Прошу меня извинить, неверно объяснил чего я хочу. Постарался исправить в первом посте. Необходимо в поочередно заносить значения из $A.Keys в $Key и из $A.Values в $Value. Не могу сделать сразу одним перебором по переменной. :-\

Iska 25-06-2013 14:32 2173958

rudimko, опять-таки непонятно — зачем «поочерёдно»? В чём смысл сего действа, почему не разом? Поясните.

rudimko 25-06-2013 15:00 2173988

А мне нужно будет при переборе выполнить различные действия с параметрами которые будут записаны в $Key и $Value, главное чтобы они соответствовали друг другу.
Смысл к примеру:
$key = название, $value = путь

Пытался сделать так
foreach ($value in $a.values)
{
foreach ($key in $a.keys)
{
write-host "$key соответствует $value"
}
}

Foreigner 25-06-2013 17:23 2174086

rudimko, Так?
Код:

$a = [ordered] @{

    "123" = "цифры"
    "абв" = "буквы"
    "-=?" = "знаки"

}

$key = $val = @()

$a.keys  | % { $key += $_ }
$a.values | % { $val += $_ }

# проверка

0..($key.count - 1) | % { "$_`: $($key[$_]) = $($val[$_])" }

Если повершелл 2-й версии, то убери "[ordered]"

Iska 25-06-2013 18:06 2174120

Код:

$table = @{
    "123" = "цифры";
    "абв" = "буквы";
    "-=?" = "знаки";
}

$table.Keys | foreach {
    Write-Host "Key: $_, Value: $($table.Item($_))"
}

rudimko, Вы хотите менять не только значения в хэш-таблице, но и ключи? Я правильно Вас понял?

rudimko 25-06-2013 18:40 2174141

Iska, ага, что-то вроде того, но мне надо еще занести в отдельную переменную.

Что вообще я пытаюсь изобразить:

$hashPath = @{
"Server1" = "\\server1\share";
"Server2" = "\\server2\share";
}

$tempDir = "d:\temp"
$backupDir = "d:\fileServer_backup"

if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe"))
{
Write-Host "$env:ProgramFiles\7-Zip\7z.exe не обнаружен."
}
set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"

sz a -tzip -w"$tempDir" "$backupDir\server1\share\archive.zip" "\\server1\share\*"
sz a -tzip -w"$tempDir" "$backupDir\server2\share\archive.zip" "\\server2\share\*"

Но вот чтобы не писать по сто раз команду "sz...", хотелось бы собирать данные из коллекции, чтобы архивирование проходило одной строчкой с перебором.
"$backupDir\server2\share\archive.zip" - подчеркнутое бралось из $hashPath.Values
"\\server2\share\*" - из $hashPath.Keys

Foreigner 25-06-2013 19:07 2174149

Цитата rudimko:
Но вот чтобы не писать по сто раз команду "sz..." »
Ну так и прогони через цикл именнованный массив (хоть можно обойтись и простым) $hashPath:
Код:

$hashPath = @{

    "Server1" = "\\server1\share";
    "Server2" = "\\server2\share";

}

$hashpath.keys    | % { "делаю что-то с этой шарой $($_)" }
$hashpath.values | % { "делаю что-то с этой шарой $($_)" }


rudimko 25-06-2013 19:19 2174154

Foreigner, Спасибо, как вариант очень годно...
Но хотелось бы еще как-то использовать foreach, чтобы при переборе параметров, в переменную $key присваивались значения из $hashPath.Keys и значению $value присваивались значения из $hashPath.Values, ПО ПОРЯДКУ!!!. Это даже уже для общего образования надо понять. ;)

Добавил чуть попозже:
Блин, как я читал? Между строк, наверное. Iska, спасибо.

Foreigner 25-06-2013 19:37 2174166

Цитата:

Цитата rudimko
ПО ПОРЯДКУ!!! »

Если Powershell 3-ей версии, как я уже выже написал, то достаточно выставить "[ordered]", или опять же создавать два массива, в которых индексы будут идентичны key = value = index -- в первом моем ответе.

Iska 25-06-2013 21:08 2174241

rudimko, да не важен здесь порядок, достаточен самый обычный перебор. Того, что уже изложили, хватит.

Как я понимаю,
читать дальше »
ноги растут из «Scripting.Dictionary» WSH:
Код:

$oDictionary = New-Object -ComObject Scripting.Dictionary

$oDictionary.Add("Server1", "\\server1\share")
$oDictionary.Add("Server2", "\\server2\share")

foreach ($elem in $oDictionary) {
    Write-Host "Key:", $elem, "Value: ", $oDictionary.Item($elem)
}

и ему примерно соответствует:
Код:

$table = @{
    "Server1" = "\\server1\share";
    "Server2" = "\\server2\share"
}

foreach ($elem in $table.Keys) {
    Write-Host "Key:", $elem, "Value: ", $table.Item($elem)
}


rudimko 25-06-2013 21:51 2174277

Iska, да, идею уже реализовал изложенным Вами способом ранее, спасибо. Все работает.


Время: 21:26.

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