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

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

UpDaTe 26-11-2012 23:33 2033533

GUI PowerShell - помогите понять пару моментов
 
Всем привет.
Написал с помощью PowerShell Studio скриптец с графическим интерфейсом (или уже программой это называть, не знаю).
Интерфейс стандартен - одна форма, на ней пару кнопок, чекбоксы, радио-переключатели, объекты типа label...
Собственно с помощью этих самых label я указываю, что происходит в программе в данный момент (меняю значение label.text="загрузка того-то", потом этой же label присваиваю текст "идет поиск" и т.д.)
Надо сказать что при нажатии кнопки "Старт" выполняется довольно много действий: импортируется модуль AD, создается объект excel, после чего заполняется заголовками столбцов, и далее уже идет непосредственно заполнение строк экселя необходимыми значениями, и сохраняется полученный файл (сам эксель пользователю не виден, так как при его создании свойство visible ставится в false).
Так вот, когда я запускаю этот скрипт из самой powershell studio, или же из powershell ISE - все мои подсказки что именно сейчас происходит - видны. Ну то есть сначала написано "импортируем модуль AD", затем написано "создаем объект excel", затем "идет поиск пользователей", причем счетчик количества найденных пользователей также меняется с каждым новым найденным и т.д. Короче запустившему скрипт человеку видно, что скрипт что-то делает, и видно на каком этапе находится.
Идем дальше, запускаю этот же скрипт (сохранив его в формате ps1) из командной оболочки powershell - запускается форма, я выбираю нужные параметры поиска, нажимаю "Старт" - и ничего не происходит со всеми моими указателями процесса. Все они остаются в начальных значениях. Форма тупо повисает, и только закончив работу, сразу рисует финальные цифры... То есть процесс то идет нормально, и результат тот же. Но вот не прорисовывается статистика выполнения. Запустившему скрипт человеку, кажется что он повис...
Такая же ситуация происходит, если запускать скомпелированный powershell студией экзешник.
Собственно вопрос - почему при запуске скрипта из powershell ISE или из powershell studio форма обновляется (тем самым меняя значения процесса выполнения), а при запуске из командной строки powershell или скомпелированного экзешника - форма зависает на все время работы скрипта и показывает уже только конечный результат?

И второй вопрос - кто-нибудь работал с потоками powershell? думаю имеет смысл засунуть зполнение экселя данными в отдельный поток, чтобы этот процесс не вешал форму... Т.к. думаю что именно в этом причина, но почему это зависит от способа запуска скрипта - вопрос выше )

Iska 26-11-2012 23:47 2033546

UpDaTe, стоит выложить код.

UpDaTe 27-11-2012 20:41 2034191

Кода там слишком много, чуть подпилю тогда можно будет )
Но хочу сказать, что проблема решается запуском командной оболочки powershell в режиме STA. Также, если при компилировании экзешника в powershell студии поставить галочку "использовать режим STA", то тоже форма не виснет. Такие вот дела.
Ну и конечно, почитав интернеты, понял что при использовании интерфейса GUI в скриптах, особенно если при нажатии на какой-либо элемент интерфейса начинает производиться долгая операция (выборка объектов, отвечающих определенным условиям, или там какой-то поиск по файловой системе), то надо юзать потоки. И лучше всего RunSpace. Но пока что в них еще не разобрался )

Iska 27-11-2012 23:44 2034341

Цитата:

Цитата UpDaTe
хочу сказать, что проблема решается запуском командной оболочки powershell в режиме STA. »

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

Цитата:

Цитата UpDaTe
Ну и конечно, почитав интернеты, понял что при использовании интерфейса GUI в скриптах, особенно если при нажатии на какой-либо элемент интерфейса начинает производиться долгая операция (выборка объектов, отвечающих определенным условиям, или там какой-то поиск по файловой системе), то надо юзать потоки. »

А стоит ли овчинка выделки? Старайтесь разбивать гигантские операции на части. Задействуйте методы, не блокирующие поток на время своего исполнения (например метод «.DownloadFileAsync()» вместо «.DownloadFile()» объекта «System.Net.WebClient»), используйте подписку на уведомления о событиях и их обработку.


Время: 02:22.

Время: 02:22.
© OSzone.net 2001-