Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230

Открыть новую тему     Написать ответ в эту тему

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Старые и смежные темы: по CMD и в Программах | по PowerShell | В помощь системному администратору | Прикладное программирование

PowerShell
Версии | Ассоциация и подпись сценариев
Сценарий для ассоциации файлов PowerShell и запуска неподписанных скриптов.
 
Прочее
Расширение возможностей
Функции
Write-Color
Output-DebugString
Провайдеры
Готовые скрипты
Полезные ссылки | Будет ли репозиторий PowerShell на ru-board?
Книги в PDF
Cheat Sheets
 

Cmd
Для перекодирования кириллицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы
 
Готовые решения и частые вопросы
 
Описания работы команд и символов участниками темы:
setlocal enabledelayedexpansion и переменные окружения
символы & и && в командной строке
Переменная %0
 
Полезные ссылки и утилиты

WSH (VBScript, JScript)
Программирование "удобняшек" на VBScript

Примечания:
• Большие куски кода заключайте в тэг [ more ]
• Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте код без пробелов иначе сценарий может работать неправильно. Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 13:40 17-02-2018 | Исправлено: YuS 2, 08:24 19-06-2021
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
В коде, без вакуумных теорий, пожалуйста

Жить без таких теорий невозможно и без труб тоже...
А если серьезно:
Если речь про функции отсюда  31-01-2020
то, скорее всего (перевожу с тарабарского на программерский ), имелось в виду, что замыкания чреваты непредсказуемыми последствиями, если про них немного "позабыть", особенно при увеличении кода в большую сторону. Зависимость результатов функций от состояния внешних переменных, само по себе, не есть хорошо... в этом есть доля истины. Но, естественно, это ведь не запрещено и иногда вполне себе применимо.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 09:29 01-02-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Цитата:
Если речь про функции отсюда

Про них.
Надо, видимо, меня носом ткнуть, не понимаю, про разные результаты
Первой даешь список и с какой цифры начать нумерацию, она и выведет пронумерованный список. Что за эффекты?
Второй даешь мин. и макс. и строку вопроса, и вернёт что выберешь, если выбор входит в заданный диапазон или снова спросит. Что за эффекты?
 
 

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 09:47 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Подвернулся кадр из презентации, отдельно не нагуглилось.
Запусти проигрывание и сразу стоп:
https://youtu.be/aZCzG2I8Hds?t=4331
 
Мы ещё не до конца осилили левый столбец
Это стоит делать не ради абстрактных "труб", а ради перехода ко второму столбцу
 
У меня такое ощущение, что 31-01-2020 шаг мимо
 
Шаг к цели будет, если выделить единственную scope с побочыми эффектами - как тут
 
Дальше вопрос стоит дискуссии, стоит ли её побить на меньшие функции/замыкания, и как это сделать правильно.
 
 
Добавлено:
 
Функции/замыкания на первых порах должны быть  
 - и без изменяемых локальных переменных (твой PrintNumberedList)
 - и без сайдэффектов (твой Get-Index),  
 
Потом можно поиграться со первым (но мне кажется это излишним или преждевременным)
А вот второе это монада "Impure". Код для их вызова обязан быть простым, а вот правильная внутренняя реализация может вынести мозг. Возможно, что именно там не обойтись без инструментов с изменяемым состоянием.
 
В видео по ссылке выше (для C#-прогеров) как раз вводятся примеры разных монад.
 
 
Добавлено:
newhk

Цитата:
Всем устраивает, кроме того что он готовый, а я хотел хоть немного разобраться сам.

 
Что мешает разобраться именно на этом примере?  
Задавай вопросы по тексту примера, он поучительный.
А во всём сразу всё равно не разберёшься.
 
Мы тоже вот не разобрались ещё.

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 11:35 01-02-2020 | Исправлено: LevT, 12:34 01-02-2020
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Что за эффекты?

Да нет в твоем коде никаких эффектов, там есть намек на замыкание, но у тебя просто используются одноименные переменные в разных областях действия.
А в чистом виде, замыкание:

Код:
function test {
    param ([Parameter(Mandatory, ValueFromPipeline)]$var)
    process { foreach ($item in $var) { "`t$begin.`t$($item)"; $begin++ } }
}
 
$list = for($i=1;$i -le 10;$i++){
    [pscustomobject]@{
        Name = 'Test' + $i
        State = 'Running'
    }
}
 
$begin = 1
test $list.name
write-host
"begin={0}" -f $begin
write-host
 
$begin = 10
test $list.name
write-host
"begin={0}" -f $begin
 

Вот и все "эффекты"

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 12:33 01-02-2020 | Исправлено: YuS_2, 15:20 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 

Код:
 
$GetIndex =
{
   param ([int] $Minimum, [int] $Maximum, [string] $prompt = "Введите цифру")
 
   do {
       [int] $Index = Read-Host -Prompt $prompt
   } while (($Index -lt $Minimum) -or ($Index -gt $Maximum))
 
   $Index
}
 

 
Присваиваемая переменной $GetIndex анонимная функция   здесь не обладает "referential transparency", т.к. результат зависит от сайдэффекта (что введёт пользователь в консоль)
А та, что присваивается переменной $PrintNumberedList ею обладает, но всё равно нечистая, т.к. испольует изменяемую локальную переменную.
 
 
Добавлено:
YuS_2
 
А твой скрипт в принципе и нечистый, и с состоянием - но он не так уж и объёмен и ясен для понимания.
Потому может быть использован из консоли с параметром, как у меня.
 
И проще для обучения.
 
 
Добавлено:
 
Следующий вариант
 

Код:

$menuScript = {
    param(
        [scriptblock]$list, $prompt, $errormsg, [string[]]$help
    )  
    function menu ($list, $prompt, [string[]]$help){
        Write-Host
        $help | Write-Host -ForegroundColor Magenta
        Write-Host
        write-host " 0. Выход" -for red
 
        for($i=1;$i -le $list.count;$i++){
            write-host " $i. $($list[($i-1)].name)" -for cyan
        }
        write-host
 
        $a = Read-Host $prompt
        return $a
    }
 
    $result = $null
    $items = & $list
 
    do {
        $choice = menu $items $prompt $help
        if ($choice -eq 0) {
            return
        } elseif ($items -and ($choice -gt 0) -and ($choice -le $items.count)) {
            $result = $items[$choice-1]  
        } else {
            write-host
            write-host $errogmsg -foregroundcolor Red
    }
    } while ($result -eq $null)
 
    $result
}
 

 

Код:

###=== вызов: ===###
 
$Params = @{
    List = {Get-Vm | where State -eq 'running'}
 
    Prompt = ' Надо выбрать виртуалку'  
    Errormsg = 'Неверный выбор, попробуй ещё.'
 
    Help =  @"
    Вас приветствует мастер экспорта виртуальных машин
    выберите нужную виртуальную машину из списка ниже
"@
}
 
& $menuScript @Params
 

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 12:36 01-02-2020 | Исправлено: LevT, 16:45 01-02-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Цитата:
Да нет в твоем коде никаких эффектов, там есть намек на замыкание, но у тебя просто используются одноименные переменные в разных областях действия.  

Всегда так делаю. шаблонно. Зачем переизобретать имя переменной. Главное понимать, что это разные переменные

Цитата:
А в чистом виде, замыкание:  

Видимо мне надо объяснить, что есть замыкание. Не вижу разницы с моим кодом
 

LevT
Цитата:
результат зависит от сайдэффекта (что введёт пользователь в консоль)  

Дак это её предназначение. Получить ввод и убедиться, что он в рамках диапазона. Всё.

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 13:24 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Нечистые функции необходимы, но надо учиться правильному с ними обращению: готовить "презервативы".
 
Контекст их вызова (scope) должна быть какая-то особенная.
Пока сформулировать не могу.
 

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 13:27 01-02-2020 | Исправлено: LevT, 14:07 01-02-2020
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Зачем переизобретать имя переменной.

Ну, не скажи... иногда это чревато последствиями...
 

Цитата:
Главное понимать, что это разные переменные

Дык, я и говорил:

Цитата:
если про них немного "позабыть", особенно при увеличении кода в большую сторону

результат может быть непредсказуемым...
 

Цитата:
Не вижу разницы с моим кодом

У тебя есть переменная с областью действия $script:begin и есть переменная $local:begin, используемая в качестве параметра функции, а у меня только $script:begin, но она таки задействована в функции... результат можно пронаблюдать.
 

Цитата:
Видимо мне надо объяснить, что есть замыкание.

Так, вот тут погуглил... попалось хорошее, наглядное пособие с картинками и как раз, про powershell:
ссылка про замыкания

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 13:51 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Смотри: у меня нечистота/impurity теперь задаётся в @Params, которых довольно много (целых 4 штуки)
 
Можно подготовить общую scope для вызова и
     того, что вызывается (сейчас оно оформлено в присвоенную $script анонимную функцию)
 
Каким-то специальным образом подготовить.
 
Содержимое $script если ты его хочешь побить далее, должно взаимодействовать внутри себя вызывая библиотечные функции из этой scope
Начать можно с изготовления вспомогательных функций, которые помогут объединить 1) содержимое $script и 2) вызов этой функции с @Params
А дальше - рефакторить так, чтобы они сгодились и для дробления содержимого $script
 
 
Добавлено:
 
Ответ научно обоснован: такая пара функций существует.
Но чтобы их написать, надо понимать гораздо больше, чем понимаем мы сейчас

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 14:06 01-02-2020 | Исправлено: LevT, 14:22 01-02-2020
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Видимо мне надо объяснить, что есть замыкание.

Ну и чтобы совсем стало понятно, вот замыкание функции в функции:

Код:
$myFunction = {
    function foo {
        function bar {
            write-host("World")
        }
        write-host("Hello");  
        Bar
    }
    return Foo
}
. $myFunction

- выполни в консоли и затем в консоли же:

Код:
foo
bar

- функция bar замкнута в локальной области функции foo
 
Добавлено:
Ну и для окончательного взрыва мозга:
closures-in-powershell

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:14 01-02-2020 | Исправлено: YuS_2, 15:08 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 
Одно дело замкнуть чистую функцию,  
совсем более другое - изменяемую локальную переменную, или недетерминированный результат Read-Host
 
Нечистота "заразна".
 
 
УПД. Разница между замыкаемой функцией и замыканием (переменной, которой можно присвоить разные анонимные функции)  
              - именно в том, что второе "дело нечистое", т.к. возможно "заражение", а в первом случае мы как-то "защищены" от него (языком).
 
В StrictMode вариантов распространения заразы меньше,  
     но принципиально она неискоренима в дотнете, ибо тут вам не Haskell.
 
 
Добавлено:
 
"Презерватив" для обращения с нечистотой есть смысл осилить не только "ради искусства"
Это необходимо в более сложных случах, чем наш пример.
 
Например, для рефакторинга малой кровью.
Типа внезапно занадобилось добавить локализацию строк (включая "0. Выход" в тексте меню)
 
 
 
Добавлено:
 
В частности, вся нечистота (включая все строки) должна приходить из вызова - @Params
 
А вот чушь написал.
Именно что одна из функций внутри scope должна уметь добавлять к нечистым $Params свой нечистый параметр $localizedExitString,  
        вызывая одну из двух искомых функций
 
 
Добавлено:
 
iNNOKENTIY21

Цитата:
Видимо мне надо объяснить, что есть замыкание.

 
Технически, в повершел это любой скрипт-скриптблок (написанный без ошибок, т.е. понятный парсеру и годный для компиляции в AST: см. тут $Verification)
 
Фундаментально, это анонимная функция, которая может быть параметром или результатом другой функции
Она может быть присвоена переменной или явно,  
     или при передаче в качестве параметра
 
Во втором случае результат присвоения останется внутри функции, при выходе будет вместе с нею уничтожен и не замусорит родительскую scope.
Иногда требуется именно такое поведение, а иногда желательно противоположное, особенно в скриптах.

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 14:16 01-02-2020 | Исправлено: LevT, 15:26 01-02-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
результат может быть непредсказуемым...  

Не вкатил, каким образом.

Цитата:
У тебя есть переменная с областью действия $script:begin и есть переменная $local:begin, используемая в качестве параметра функции, а у меня только $script:begin, но она таки задействована в функции...

Это то понятно, дань скриптовости. И это хорошо?  Еще есть if, переменная в котором, вдруг не локальна, внутри фигурных скобок

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 15:48 01-02-2020 | Исправлено: iNNOKENTIY21, 15:58 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Тот, кто будет использовать твои  
$PrintNumberedList и $GetIndex
 
- обязательно захочет их подправить по-своему.
В результате ему снесёт крышу очень качественно
 
Ну, или к этому скрипту должен прилагаться доступ к телу его автора-раба, обязанного оказывать поддержку.

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 16:18 01-02-2020 | Исправлено: LevT, 16:36 01-02-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
$PrintNumberedList =
{
   param ([Parameter(Mandatory, ValueFromPipeline)]$list, [int] $begin = 1)
   process { foreach ($item in $list) { "`t$begin.`t$($item)"; $begin++ } }
}

$PromptIndex =
{
   param ([int] $Minimum, [int] $Maximum, [string] $prompt = "Введите цифру")

   do {
       [int] $Index = Read-Host -Prompt $prompt
   } while (($Index -lt $Minimum) -or ($Index -gt $Maximum))

   $Index
}

function Menu($list, [scriptblock] $ScriptBlock) {
   [int] $begin = 1; & $PrintNumberedList -list $list.Name -begin $begin
   $list[(& $PromptIndex -Minimum $begin -Maximum $list.Count) - $begin] |
   & $ScriptBlock
}

$list = foreach ($l in 1..10) { [PSCustomObject] @{ Name = 'Test - ' + $l; State = 'Running' } }

Menu -list $list -ScriptBlock {
   param([Parameter(ValueFromPipeline)] $item)
   Write-Host "Вы выбрали: $($item.Name)"
}

Т.е. надо всё запихать в функцию menu? %)
 
 
LevT

Цитата:
обязательно захочет их подправить по-своему.
В результате ему снесёт крышу очень качественно  

В смысле подправить? А если твою решит подправить, в которй может быть любая сложная реализация… не снесёт?
 
Функции предельно просты, в чём их запредельная сложность не понимаю.

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 16:25 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно ли разбирать на части скрипт-скриптблок отсюда (присваеваемый переменной $menuScript)?
 
По-моему, нет: он делает одно дело для пользователя, и делает его качественно.
В шапку его?
 
Попытаться разобрать его на части может быть интересно нам, разработчикам.
По моей оценке, сделать это правильно/с пользой для нас труднее, чем кажется навскидку.
Именно из-за его "нечистоты".
 
 
Добавлено:
 

Цитата:
Функции предельно просты, в чём их запредельная сложность не понимаю.

 
В том, что правильные функции такого рода - пара абстрактных функций, работающие с любой "нечистотой"
Мы пока не доросли написать ни их, ни их конкретное воплощение для этой задачи.
 
 
 
Добавлено:
 
Вариант с возможностью валидации параметров через класс:
 
 

Код:

 
### скрипт, дающий пользователю возможность выбрать один объект из нескольких
 
$menuScript = {
    param(
        [Parameter(ValueFromPipeline)]
        [MenuParams]$Params
    )
     
       
    function menu ($list, $prompt, [string[]]$help){
        Write-Host
        $help | Write-Host -ForegroundColor Magenta
        Write-Host
        write-host " 0. Выход" -for red
 
        for($i=1;$i -le $list.count;$i++){
            write-host " $i. $($list[($i-1)].name)" -for cyan
        }
        write-host
 
        $a = Read-Host $prompt
        return $a
    }
 
    $result = $null
    $items = & $Params.List
 
    do {
        $choice = menu $items $Params.Prompt $Params.Help
        if ($choice -eq 0) {
            return
        } elseif ($items -and ($choice -gt 0) -and ($choice -le $items.count)) {
            $result = $items[$choice-1]  
        } else {
            write-host
            write-host $Params.Errogmsg -foregroundcolor Red
    }
    } while ($result -eq $null)
 
    $result
}
 
 
Class MenuParams {
## Validate parameters here (not yet implemented)
    [scriptblock]$List
    [String]$Prompt
    [String]$Errormsg
    [String[]]$Help  
}
 
 
$Params = @{
    List = {Get-Vm | where State -eq 'running'}    ### по желанию любая вундервафля: меню будет с нею работать
 
    Prompt = ' Надо выбрать виртуалку'  
    Errormsg = 'Неверный выбор, попробуй ещё.'
 
    Help =  @"
    Вас приветствует мастер экспорта виртуальных машин
    выберите нужную виртуальную машину из списка ниже
"@
}
 
[MenuParams]$Params | & $menuScript
 


----------
Проект Либген v2 //
Обсуждение

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 16:26 01-02-2020 | Исправлено: LevT, 18:27 01-02-2020
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 01-02-2020

Цитата:
И это хорошо?

Это ни хорошо и ни плохо, просто надо это учитывать.

Код:
function test1 {
    $var+=5
    "var_test1 = {0}" -f $var
}
 
function test2 {
    $script:var+=5
    "var_test2 = {0}" -f $var
}
 
$var = 1
 
"var = {0}" -f $var
 
test1
 
"var_after_test1 = {0}" -f $var
 
test2
 
"var_after_test2 = {0}" -f $var

 

Цитата:
Еще есть if, переменная в котором, вдруг не локальна, внутри фигурных скобок

if - не функция и не имеет собственной, локальной области действия переменных. Так что не понял почему "вдруг"?

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:38 01-02-2020 | Исправлено: YuS_2, 18:40 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
 
Кстати, твоё меню выбирает один пункт.
Для шапки можешь сделать вариант с мультиселектом

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 19:15 01-02-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Цитата:
Это ни хорошо и ни плохо, просто надо это учитывать.  

Я знаю про области видимости, я не понимаю какие могут быть грабли.
Иными словами, Главное понимать, что это разные переменные.
Пример чётко показывает, что в случае надобности можно указать пространство имён, тут это Script:
Наверно, грабли, при использовании двух этих стилей, типа запутаться можно?
Функция изменяет, только свои локальные значения и возвращает результат или функция изменяет значения в области скрипта…

Цитата:
Так что не понял почему "вдруг"?

Потому, что, всё в фигурных скобках, должно бы считать локальной областью. А тут сократили.
Разное поведение внутри фигурных скобок = грабли, интуитивно не понятные. И так у старшего брата в .net
 
 
 
 
Добавлено:

И немного о вчерашнем…
 

Код:
function YourChoice {
   [int] $number = Read-Host 'Сделайте выбор и нажмите ENTER'

   if (($number -gt 0) -and ($number -lt ($i))) {
       # если номер больше 0, и если номер меньше $i
       $vmname = @($vmlist)[$number - 1].Name
       $vmname
       return
   } else {
       "неправильно введён номер"
       YourChoice
   }
}

$vmlist = Get-ChildItem $env:tmp -File

$i = 1

foreach ($item in $vmlist) {
   "`t$i.`t$($item.Name)"
   $i++
}
YourChoice

 
Рекурсия плохо?

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 19:16 01-02-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Рекурсия в данной ситуации это развлечение разработчиков (одно из многих возможных)
Для практического повторного использования лучше подходит универсальный скрипт
 
Кстати, я осознал, что забыл вытащить один параметр
 

Код:
 
$Params = @{
    List = {Get-Vm | where State -eq 'running'}    ### по желанию любая вундервафля: меню будет с нею работать
 
    GetTitle = {param ($Item) $Item | select -ExpandProperty Name}    ### добыча из неё отображаемого заголовка  
 
    Prompt = ' Надо выбрать виртуалку'  
    Errormsg = 'Неверный выбор, попробуй ещё.'
 
    Help =  @"
    Вас приветствует мастер экспорта виртуальных машин
    выберите нужную виртуальную машину из списка ниже
"@
}
 

 
Помоги лучше доделать
 
Добавлено:
 
 
Это меню типа Single Choice
Напрашивается добавление сюда по аналогии другого меню, Multiple Choice

Всего записей: 17740 | Зарегистр. 14-10-2001 | Отправлено: 20:11 01-02-2020 | Исправлено: LevT, 20:28 01-02-2020
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
не понимаю какие могут быть грабли

Да нет никаких грабель, они будут как только отвернешь голову в сторону и бац, наступил на них, даже если перед этим их не было.
Ты прав, просто об этих особенностях важно не забывать.
 

Цитата:
типа запутаться можно?

Именно!
Но, всё же почитай про closures-in-powershell, по ссылке выше... там есть про скриптблоки, счетчики, их приращения и возможные грабли... скорее всего, даже более понятно, чем я тут пытался "объяснять".
 

Цитата:
Потому, что, всё в фигурных скобках, должно бы считать локальной областью.

На каком таком основании? Это где-то описано?
Во многих языках есть разные особенности, в том числе и не только в программировании, которые с точки зрения прямой логики - нонсенс, тем не менее, они вполне себе живут и здравствуют.
Например, омонимы - на кой фиг они нужны? Ан нет, существуют же!
В нашем случае важно помнить разницу между скриптблоками и не самостоятельными блоками кода, относящимися к какому-либо оператору. Например, важное отличие - скриптблоки "знают", что такое параметры, а зависимые блоки кода - нет или отсутствие локальной области действий: в скриптблоках есть, а в зависимых блоках кода - нет и т.д.
Кстати, тут вот вспомнилось: в PS 7.0 реализовали таки тернарный оператор, так что теперь иногда можно даже обойтись без if и его блоков кода.
 

Цитата:
И немного о вчерашнем…

Не помню, писал ли я уже об этом...  в общем, все наши велосипеды, можно просто перечеркнуть одним единственным действием:

Код:
install-module ps-menu

Расписывать не буду, лучше посмотреть наглядно и с гифками.
 
А рекурсия - это тоже ни плохо, ни хорошо, она существует и всё тут. Но лично я, постарался бы её по возможности избегать - возможно, это субъективно, но как-то вот так.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:51 01-02-2020 | Исправлено: YuS_2, 20:59 01-02-2020
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru