Показать полную графическую версию : Обработка коллекции через foreach ()
Давно не брался за PS, все подзабыл.
Создаю коллекцию:
$A = @{
"123" = "цифры";
"абв" = "буквы";
"-=?" = "знаки";
}
Вот как перебрать $Key in $A.Keys и $Value in $A.Values разом?
Пытаюсь делать через foreach () {}, выходит какае-то чепуха. Точнее, ничего не выходит.
Заранее спасибо.
rudimko, непонятно, чего Вы хотите. Что значит — «в одном цикле сразу»? Зачем тут вообще цикл?
Прошу меня извинить, неверно объяснил чего я хочу. Постарался исправить в первом посте. Необходимо в поочередно заносить значения из $A.Keys в $Key и из $A.Values в $Value. Не могу сделать сразу одним перебором по переменной. :-\
rudimko, опять-таки непонятно — зачем «поочерёдно»? В чём смысл сего действа, почему не разом? Поясните.
А мне нужно будет при переборе выполнить различные действия с параметрами которые будут записаны в $Key и $Value, главное чтобы они соответствовали друг другу.
Смысл к примеру:
$key = название, $value = путь
Пытался сделать так
foreach ($value in $a.values)
{
foreach ($key in $a.keys)
{
write-host "$key соответствует $value"
}
}
Foreigner
25-06-2013, 17:23
rudimko, Так?
$a = [ordered] @{
"123" = "цифры"
"абв" = "буквы"
"-=?" = "знаки"
}
$key = $val = @()
$a.keys | % { $key += $_ }
$a.values | % { $val += $_ }
# проверка
0..($key.count - 1) | % { "$_`: $($key[$_]) = $($val[$_])" }
Если повершелл 2-й версии, то убери "[ordered]"
$table = @{
"123" = "цифры";
"абв" = "буквы";
"-=?" = "знаки";
}
$table.Keys | foreach {
Write-Host "Key: $_, Value: $($table.Item($_))"
}
rudimko, Вы хотите менять не только значения в хэш-таблице, но и ключи? Я правильно Вас понял?
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
Цитата rudimko:
Но вот чтобы не писать по сто раз команду "sz..." »
Ну так и прогони через цикл именнованный массив (хоть можно обойтись и простым) $hashPath:
$hashPath = @{
"Server1" = "\\server1\share";
"Server2" = "\\server2\share";
}
$hashpath.keys | % { "делаю что-то с этой шарой $($_)" }
$hashpath.values | % { "делаю что-то с этой шарой $($_)" }
Foreigner, Спасибо, как вариант очень годно...
Но хотелось бы еще как-то использовать foreach, чтобы при переборе параметров, в переменную $key присваивались значения из $hashPath.Keys и значению $value присваивались значения из $hashPath.Values, ПО ПОРЯДКУ!!!. Это даже уже для общего образования надо понять. ;)
Добавил чуть попозже:
Блин, как я читал? Между строк, наверное. Iska, спасибо.
Foreigner
25-06-2013, 19:37
ПО ПОРЯДКУ!!! »
Если Powershell 3-ей версии, как я уже выже написал, то достаточно выставить "[ordered]", или опять же создавать два массива, в которых индексы будут идентичны key = value = index -- в первом моем ответе.
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)
}
Iska, да, идею уже реализовал изложенным Вами способом ранее, спасибо. Все работает.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.