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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

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.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

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



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

Цитата:
Это утверждение чем-то можно подкрепить?  

Когда командлету указываешь конкретно что делать,  
а не он сам проверяет что нужно, действие происходит быстрее.
Все что делаю, проверяю через measure-command.
С одним параметром или одним действием это может быть не заметно,
разница маленькая, и зависит от командлета и действия.
По этому я эти трубы не использую вообще. и не только из-за скорости.
для меня разница в 5мс в одном действии, уже повод выбрать быстрейший,
Так как в итоге если на вех действиях потерять даже по 5-10мс, будет разница в секунду, которая уже сильно заметна.
 
Добавлено:
пример

Всего записей: 1393 | Зарегистр. 12-12-2006 | Отправлено: 18:18 16-11-2018
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
westlife
Спасибо. Я, как всегда, чуток не дошел. Надо почаще fl * делать.

Всего записей: 2478 | Зарегистр. 27-07-2009 | Отправлено: 19:13 16-11-2018
LevT



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

Цитата:
а не он сам проверяет что нужно,  

 
Вы даже не представляете, сколько всего он проверяет.
Всегда, и неотключаемо.
 
Люди постарались сделать хитроумную машину, готовую чтобы с удобством ездить
То есть - писать и улучшать скрипты.
 
Выигрыш секунды во время исполнения не стоит того, чтобы утяжелять код.
В 88% случаев.
 
 
Добавлено:

Цитата:
Из моего примера все четко понятно,  
и так же можно понять некоторые вещи, которые в трубах не видны.  

 
ну то есть Вам виднее, как использовать микроскоп.
Ясно же, что это годное устройство для забивания гвоздей.





Мля, ты снова начал бугорозить... сутки выписал

Всего записей: 17200 | Зарегистр. 14-10-2001 | Отправлено: 19:16 16-11-2018 | Исправлено: KLASS, 11:01 17-11-2018
YuS_2



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

Цитата:
Когда командлету указываешь конкретно что делать,  
а не он сам проверяет что нужно, действие происходит быстрее.  
Все что делаю, проверяю через measure-command.  
С одним параметром или одним действием это может быть не заметно,  
разница маленькая, и зависит от командлета и действия.

Ну, в данном случае сравнивается, всё же не конвейерная обработка, а оператор цикла foreach с командлетом foreach-object, а это не совсем корректное сравнение.
Да, оператор работает быстрее, это действительно так. Но, у каждого инструмента есть свои плюсы и минусы, а также конкретное предназначение.
1. Для работы с оператором необходимо больше памяти, в случае c командлетом её потребление будет более щадящим.
2. Для работы с оператором необходимо сначала получить коллекцию и последовательно обрабатывать все элементы коллекции. А работа с конвейером достаточно затруднена. С командлетом возможен отбор элементов коллекции по какому-либо признаку и дальнейшая обработка в foreach-object уже отобранных элементов...
3. У оператора отсутствуют такие блоки как begin, process, end ...
 

Цитата:
С одним параметром или одним действием это может быть не заметно,  
разница маленькая, и зависит от командлета и действия.

Да, в каких-то случаях, оператор forech использовать выгоднее, но чтобы отказываться от конвейров совсем:

Цитата:
По этому я эти трубы не использую вообще.

... это не аргумент.
Отказ от конвейров чреват тем, что достаточно большие возможности powershell, просто останутся для Вас в стороне... ведь, в powershell можно создавать далеко нелинейный код и создавать решения очень сильно отличающиеся друг от друга самим способом того решения, учитывая и возможности dotnet...
Кроме того, вот небольшое исследование, которое наглядно показывает, что не во всех случаях у оператора foreach есть преимущество в скорости обработки... в общем, всё хорошо в меру и максимализм тут неуместен, как говорится
 
 
Добавлено:
LevT

Цитата:
ну то есть Вам виднее, как использовать микроскоп.  
Ясно же, что это годное устройство для забивания гвоздей.

Не начинай только опять со своими аллегориями, ну нафик они не нужны, от слова совсем. Каждый для себя может решить сам, что ему требуется от powershell, а не консультироваться с LevT, микроскоп ли это или
пушка для воробьев...
Ну, никак и ничем твои аллегории не нагляднее живых примеров и аргументированных возражений, которые можно было бы привести... было бы только желание.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:07 16-11-2018 | Исправлено: YuS_2, 20:09 16-11-2018
westlife



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Я уже привык, LevT на меня все время ругается
Подробнее

Всего записей: 1393 | Зарегистр. 12-12-2006 | Отправлено: 21:56 16-11-2018
YuS_2



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

Цитата:
Я не знал, что тема с трубами запретная

Не то, чтобы запретная... просто для некоторых она чувствительная
Вообще, тут многое зависит от контекста - что, когда и как использовать...
И поэтому, конечно же, обязательное использование конвейеров никак не регламентируется, но при этом, их использование часто существенно облегчает жизнь.
 

Цитата:
Я вам не про foreach говорил, а вообще в целом.

Так и я о том же...  
Но:
Как бы то ни было, а отказываться от конвейеров совсем (по любой причине) - это искусственно ограничивать себя в возможностях программной среды (особенно в powershell, в котором конвейеры достаточно развиты).

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 23:14 16-11-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
westlife
Вы меряете по себе, имея некоторый программистский и скриптописательский стаж.
Новичкам сейчас знать о циклах - вредно!
 
Это знание только обременяет
Надо учиться добиваться своих целей с помощью давно доступного в винде движка, управляемого высокоуровневым языком.
 
Понятие, например, фильтра бесконечно важнее понятия цикла.  
С его помощью цели и ставятся, и воплощаются быстрее.
 
 
Добавлено:
YuS_2
 
Отказываться от конвейеров в PS - это типа как тюнинговать современную машину с целью обойтись без электроники.
Дедовские Лады ездили же без всяких этих выдумок!
 
 
Добавлено:
Любая PS строчка это всегда конвеер, хотите вы этого или нет.
 
К ней неявно дописывается | Out-Default  
- командлет с недюжиным "искусственным интеллектом",  
и вся конструкция скармливается PipelineProcessor-у в коде движка.

Всего записей: 17200 | Зарегистр. 14-10-2001 | Отправлено: 23:17 16-11-2018 | Исправлено: LevT, 23:23 16-11-2018
YuS_2



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

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 23:38 16-11-2018
Smitis



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

Цитата:
Это утверждение чем-то можно подкрепить?  

Я думаю, да.
В конвейере происходит неявная передача параметра, через анонимную переменную. Область действия этой переменной - глобальная. При вложенных "трубах" это потенциальный источник трудноопределимых ошибок. А если учесть переменные типа ValueFromPipelineByPropertyName, так это вообще то, что "там у них" называют "выстрелить себе в ногу".


----------
Разум когда-нибудь победит

Всего записей: 3233 | Зарегистр. 09-02-2003 | Отправлено: 00:49 17-11-2018 | Исправлено: Smitis, 00:52 17-11-2018
PhoenixUA



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Забыли еще про .foreach() метод.

Всего записей: 2184 | Зарегистр. 17-11-2005 | Отправлено: 01:16 17-11-2018
LevT



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

Цитата:
Область действия этой переменной - глобальная. При вложенных "трубах" это потенциальный источник трудноопределимых ошибок.  

 
Не бывает вложенных труб
 
 
PhoenixUA

Цитата:
Забыли еще про .foreach() метод.

И свойство .Count, добавленное движком ко всем объектам (заведомо единичным)
Ради того, чтобы обращаться с ними так же как с массивами.

Всего записей: 17200 | Зарегистр. 14-10-2001 | Отправлено: 01:37 17-11-2018 | Исправлено: LevT, 01:45 17-11-2018
Smitis



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

Цитата:
Не бывает вложенных труб

Ok.
что-то | foreach { что-то | foreach { что-то }}
Это не "вложенная труба".
Это извраты терминологии.


----------
Разум когда-нибудь победит

Всего записей: 3233 | Зарегистр. 09-02-2003 | Отправлено: 02:05 17-11-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скриптблоки бывают вложенные, это да.
А трубы никогда.
 
 
Добавлено:
Труба всегда "течёт" от начала к концу
 
Первый командлет трубы - что-то вроде её конструктора (берёт скаляр, например [string]имя файла, выплёвывает объект, например инстанс [FileInfo] или сразу массив строк этого файла и т.д),
последний как правило Out-Default - даже если скриптописатель о том не ведает.  

Всего записей: 17200 | Зарегистр. 14-10-2001 | Отправлено: 02:11 17-11-2018 | Исправлено: LevT, 02:22 17-11-2018
YuS_2



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

Цитата:
В конвейере происходит неявная передача параметра, через анонимную переменную.

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

Цитата:
Область действия этой переменной - глобальная.

Хмм, не думаю... глобальная, вряд ли.
 

Цитата:
При вложенных "трубах" это потенциальный источник трудноопределимых ошибок.

А это вопрос, скорее, синтаксиса, да и привычек тоже... ну и возможно, использование трапов, трукатчей и т.д.
Powershell ведь выводит ошибки и часто достаточно подробно. Хотя, с другой стороны, соломки везде подстелить, вряд ли, возможно... но то, что реализовано не хуже, чем в других аналогичных инструментах (а есть ли они такие же, с аналогичными возможностями? вот в чем вопрос ещё), несомненно. Естественно, речь не о привнесенных инструментах...
 

Цитата:
А если учесть переменные типа ValueFromPipelineByPropertyName, так это вообще то, что "там у них" называют "выстрелить себе в ногу".  

Почему?

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:04 17-11-2018
Smitis



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

Цитата:
Хмм, не думаю... глобальная, вряд ли.  

Переменная $_ существует везде, а вот значение может приобретать разное и неявно.
Поясню на примере. Берём функцию в обычном языке программирования. Имена параметров имеют локальную область видимости. Правильно выбрать имена параметров и дальше их имена ни с чем не пересекутся даже во вложенных функциях. В PS переменная $_ видна везде, но вот какое значение она имеет в данный конкретный момент, зависит от контекста.
С переменными ValueFromPipelineByPropertyName вообще забавная вещь получается.
Вот например Get-ChildItem | Remove-Item, что передаётся по конвейеру? Правильно, объект. От чего фанатики кипятком писают от восторга. А дальше? А дальше стараниями разработчиков концепция использования объектов в потоке отправляется в пешее эротическое путешествие так как Path и LiteralPath имеют тип string и принимают значения из объекта именно как ByPropertyName. Кроме того, попутно неявно присваиваются другие параметры, например Credential. И пользователь этот процесс никак не контролирует и даже скорее всего не знает. В данном примере всё хорошо. Свойства объекта согласованы с параметрами. Но вот в собственных функциях Вы ВНЕЗАПНО можете получить в параметры совсем не то, что ожидали. И это называют бест практик!
Если же отказаться от использования конвейер и того же foreach-object заменив его на оператор foreach, все параметры придётся передавать ЯВНО, зато код становиться читаемым, все передачи параметров прозрачны. И это называют плохой практикой!
Создаётся впечатления, что все эти "практики" малость не в себе и с головой плохо дружат.

Цитата:
Почему?

Резюмирую вышесказанное - неявная передача параметра это потенциальный источник ошибок так как пользователь не видит и не контролирует этот процесс. А неявная передача сразу нескольких параметров это ещё больший источник ошибок.
 
П.С.
Типичный пример - оператор with в js. Свойства объекта легко перекрывают внешние переменные и на эти грабли наступает столько народа, что все рекомендуют этот оператор вообще не использовать. В этом плане оператор with в vb (vba, vba) реализован чуть лучше.
 


----------
Разум когда-нибудь победит

Всего записей: 3233 | Зарегистр. 09-02-2003 | Отправлено: 13:25 17-11-2018 | Исправлено: Smitis, 13:25 17-11-2018
PhoenixUA



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С переменной $_ сам один раз наступил на грабли:
использовал её в Foreach-Object, а внутри него был catch с этой же переменной
И, сюрприз, в catch переменной присваивается эксепшн...
 
Я очень удивлялся, когда в IIS создался виртуальный каталог с очень загадочным названием )))

Всего записей: 2184 | Зарегистр. 17-11-2005 | Отправлено: 15:27 17-11-2018
YuS_2



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

Цитата:
Переменная $_ существует везде, а вот значение может приобретать разное и неявно.

Это утверждение также требует практического подкрепления...
Чем определяется глобальность переменной? Вот из этого надо исходить. Мы не можем её вызвать где захочется, только в определенном месте кода, и только в текущем значении, как только выходим из этого определенного места, переменная уничтожается, а это говорит, как раз о её локальной области действия.
"$_ - Same as $PSItem. Contains the current object in the pipeline object. You can use this variable in commands that perform an action on every object or on selected objects in a pipeline."
И это, действительно так. Проверяется легко, поэтому примеры приводить не вижу смысла.
 

Цитата:
В PS переменная $_ видна везде, но вот какое значение она имеет в данный конкретный момент, зависит от контекста.

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

Код:
get-variable -scope global


Цитата:
А дальше стараниями разработчиков концепция использования объектов в потоке отправляется в пешее эротическое путешествие так как Path и LiteralPath имеют тип string и принимают значения из объекта именно как ByPropertyName.

Просто рассуждения:
Так чем это чревато? Да, согласен, что при передаче по конвейеру изменение типов может приводить к всякого рода неожиданностям... но, может быть, это просто надо учитывать при составлении кода?
 

Цитата:
Но вот в собственных функциях Вы ВНЕЗАПНО можете получить в параметры совсем не то, что ожидали.

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

Цитата:
неявная передача параметра это потенциальный источник ошибок так как пользователь не видит и не контролирует этот процесс.

Ну почему же? Пользователю, возможно и не требуется этот контроль... требуется, всего лишь, при необходимости, в любом месте конвейера получать требуемые свойства объекта или совершать над ним необходимые действия...
Гипотетически, любой код может быть источником потенциальных ошибок, а иначе, уже давно какой-нибудь язык признали бы идеальным и пользовались бы только им, а не плодили лишние сущности (бритвы на них нет соответствующей)
А вообще, надо нам всем при составлении кода не забывать перечитывать справку, чтобы исключать возможные ошибки...
Например, about_Scopes (это просто пример) - много познавательного и освежающего память, обнаруживаю каждый раз...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:35 17-11-2018 | Исправлено: YuS_2, 08:04 18-11-2018
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как бы в powershell, получить direct link с sourceforge.net, яндекс.диск, кто нибудь подобное делал или встречал на просторах?

Всего записей: 3522 | Зарегистр. 16-08-2012 | Отправлено: 19:33 17-11-2018
PhoenixUA



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

Цитата:
Ну не так ведь... это автоматическая переменная, которая возникает и принимает значение только текущего объекта и только в текущем конвейере... далее она уничтожается... или требуется пример опровергающий это. До сих пор, лично мне, такого не попадалось.  

 
Я привёл пример выше.
 
Вот ещё цитата:

Цитата:
When an exception occurs you can look up the error in the $error collection, or while inside a catch block under the $_ variable.

https://blogs.msdn.microsoft.com/kebab/2013/06/09/an-introduction-to-error-handling-in-powershell/
 
Foreach-Object относится к конвейеру? Ну вот, если использовать catch внутри foreach, можно нарваться на неожиданные последствия )

Всего записей: 2184 | Зарегистр. 17-11-2005 | Отправлено: 21:01 17-11-2018
YuS_2



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

Цитата:
Я привёл пример выше.

То был не пример, а намек на него.
Тем не менее:
Читаем спецификацию:

Цитата:
o    If the try block of S encloses the throw point and if S has one or more catch clauses, the catch clauses are examined in lexical order to locate a suitable handler for the exception. The first catch clause that specifies the exception type or a base type of the exception type is considered a match. A general catch clause is considered a match for any exception type. If a matching catch clause is located, the exception processing is completed by transferring control to the block of that catch clause. Within a matching catch clause, the variable $_ contains a description of the current exception.

и поэтому:

Цитата:
Foreach-Object относится к конвейеру? Ну вот, если использовать catch внутри foreach, можно нарваться на неожиданные последствия )

Используя try-catch внутри какой-либо локальной области действия $_, мы просто получаем ещё одну, дочернюю локальную область действия... Ведь, по сути, try-catch (а также trap), это не совсем обычный командлет или даже конвейер и для него существует спецификация работы, а это следует учитывать при составлении кода.
Какая тут может быть неожиданность, если есть описание принципа работы? Как-то так, сюрприза нет, на самом деле.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:33 18-11-2018 | Исправлено: YuS_2, 08:45 18-11-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум 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