0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 1
|
||||||
1 | ||||||
Создание окна для ввода и вывода информации14.06.2013, 16:44. Показов 76420. Ответов 19
Метки нет (Все метки)
Приветствую!
Кто-нибудь сталкивался с задачей создания окон в powershell и вывода инфы командлетов в gui-окна? То есть формируется окно, в него вводится инфо, на основе введенного формируется запрос и ответ выдается тоже в gui окне (идет обращение к AD и возвращает инфу из профиля) Пока только нашел, как создать окно, но тут застопорился...
0
|
14.06.2013, 16:44 | |
Ответы с готовыми решениями:
19
Написать программу для ввода-вывода информации о пяти студентах Создание формы для вывода информации Создание шаблона для ввода информации Создание формы для ввода информации в таблицу |
MoxFulder
|
||||||
15.07.2013, 17:17 | 2 | |||||
Скачиваешь: [deleted] (Это primalforms community edition), если нет доверия к моей ссылке, то можно скачать на их сайте: http://www.sapien.com/ в списке программ её нет (интегрировали в платную версию PowerShell Studio), нужно зарегистрироваться, после чего в спец разделе загрузок, можно будет скачать этот файлик с установкой только редактора форм).
Далее визуально создаёшь необходимую форму, экспортируешь в буфер (или сразу в повершел файл). И в сгенерированном коде добавляешь действия для кнопок (в коде уже будут заготовки):
Сразу предупреждаю, что могут возникнуть некоторые сложности с реализацией задумок с использованием Powershell =) Если будут, вопросы, пиши. |
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
||||||
13.11.2020, 05:49 | 3 | |||||
Самый простой обходной путь - буфер обмена. Даже удивило, что русские буквы не потерялись.
Вообще, $objForm - это другое окно по сути и для того, чтобы общаться с ним, нужно работать с другим потоком PS. и код получится не слишком и большой, но слишком "дурной". Я делал когда то пример общения между формами на C#, и есть готовый пример, но не сейчас ... Может позже.
0
|
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
|
|
13.11.2020, 23:01 | 4 |
есть большоу количестро способов взаимодействия PS и C# - clipboard это довольно оригинально
6 лет назад я про формы написал статью http://www.codeproject.com/Art... -Windows-F посмотрите там полно приверов и есть гитахб http://www.codeproject.com/Art... -Windows-F
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
|
14.11.2020, 09:50 | 5 |
Возможно вы не поняли. Многопоточность - при взаимодействии между формами одной программы и одного языка.
Когда вы запускаете новую форму, поток основной программы останавливается и естественно не может ни знать ни получить переменные основного потока. Вот поэтому и необходим второй поток. Если же говорить о взаимодействиях между ..., то в данный момент..., уже полгода наверное хочу разобраться, и всё ещё нахожу более "важные" дела... в возможности вставки уже скомпилированного кода c# непосредственно в скрипты. Конечно - это довольно круто в отношении скорости выполнения, но совершенно теряет достоинство программирования на скриптах - скорости модификации кода программы. Вот ссылки, которые я сохранил, для начала процесса собственного ликбеза по этому вопросу: https://www.ired.team/offensiv... ttojscript https://gist.github.com/vector... 3b151120d9 Может и заинтересует
0
|
1792 / 343 / 100
Регистрация: 26.09.2020
Сообщений: 676
|
||||||
14.11.2020, 16:48 | 6 | |||||
$Script:x не годится?
1
|
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
|
|
15.11.2020, 05:10 | 7 |
@Garric base64 делать нет необходимости из повершелла компилируются во время выполнения какие хотите другие .net языки
для того чтобы передать данные из win32 или wpf в скипт достаточно стандарнтый способ - создать реализацию IWin32Window https://docs.microsoft.com/en-... in32window - и через ее Handle { get; } Property Value IntPtr A handle to the window represented by the implementer. передать хендл окна в котором работает скрипт в форму https://docs.microsoft.com/en-... showdialog Код
$window_handle = [System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle $f = New-Object System.Windows.Forms.Form ... рисуем форму и т.д. Add-Type -TypeDefinition @" using System; using System.Windows.Forms; public class Win32Window : IWin32Window { private IntPtr _hWnd; private int _data; public int Data { get { return _data; } set { _data = value; } } public Win32Window(IntPtr handle) { _hWnd = handle; } public IntPtr Handle { get { return _hWnd; } } } "@ $caller = new-object Win32Window -ArgumentList ($window_handle) [void]$f.ShowDialog([win32window]($caller)) примеры там в статье
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
|||||||||||
15.11.2020, 14:17 | 8 | ||||||||||
А в чём смысл? Вызвать из PS C# экзешник, создать форму(что либо другое), получить хэндл, передать обратно? ...
если есть возможность вставить уже скомпилированный код? Ну ..., по крайней мере это касается только js и vbs, как видно их представленной мной ссылки. Для PS пожалуй, всё же придётся "копать" ваш вриант. Конечно, js - пожалуй наиболее любимый мой язык, даже для windows, но почему то пишу постоянно, то батники, то PS. Похоже, потому что всегда есть похожие примеры. А на js обычно - всё с нуля, и с запросами к внешним прогам ... начиная с собственного местоположения. К сожалению, вчера перекопал все свои архивы, пример с формами в разных потоках "сгорел" при случайном изменении разметки ntfs на GPT, при попытке, для пробы, установить планшетный, заточенный для промышленной установки windows, как дополнительную систему. ... ну он просто автоматически форматнул весь мой диск. Было грусто ... очень. Большую часть информации, мне всё же удалось вернуть, что то из архивов, что то Starus(ом), и ... затем js скрипты, уже при помощи ... WinHex. И то не все, и то только потому, что я помнил названия, не всех, а большинства js файлов на память. (ни одна программа восстановления данных, как оказалось не сканирует всё! Они сканируют лишь определённые типы файлов, js в которые не входит!) Так что надежда на то, что всё обойдётся не всегда оправдана. Если бы нашёл мой пример. Хотя мне, это уже кажется как глюк моей памяти, конечно бы выложил. Остался лишь пример (крутануть данные из TextBox1 через другой поток, возможно, что то поделать с ними там, пока основной "крутится где то в недрах своей формы" и вставить их в TextBox2). Возможно даже это поможет.
Да, ещё. Крутани в моём коде С#, в основном потоке, какой нибудь счётчик, чтобы удостоверится, что поток не "застыл". Я этого не сделал когда то, понимая, что это должно работать по web опыту, прежде чем пытаться прикрутить. Просто я не знал тогда, для чего мне это было в тот момент нужно. По крайней мере, в любом случае, операции, которые можно распараллелить, лучше распараллеливать. В инете вообще нет работающих "многопоточных" примеров. Всё из разряда "так должно быть" и всё на этом. Добавлено через 3 часа 26 минут Нет. Определённо это работает. Я делал эти 2 окна, передающих данные друг другу и тупо смотрел на них ... думая: "и нак это мне надо? Я понимаю сам второй поток: видео, фото, но эта шняга зачем" Оказалось, что возможно, довольно востребованная "штука" в PS, где возможно можно сделать свои окна, сместив неудобный с точки зрения компиляции C# с "домашнего" программирования.
0
|
㊙️
1091 / 239 / 57
Регистрация: 10.08.2018
Сообщений: 568
|
|
15.11.2020, 18:29 | 9 |
Вы какую задачу решаете?
Эту: или как получить данные из textbox? Буфер обмена здесь трогать не нужно.
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
|
15.11.2020, 20:44 | 10 |
Будь добр. Найди мне фразу а этой ветке: "Буфер обмена здесь трогать не нужно."
0
|
1792 / 343 / 100
Регистрация: 26.09.2020
Сообщений: 676
|
||||||
16.11.2020, 16:08 | 11 | |||||
А тема то старая
У топик стартера в коде форма закрывается. Требуется вывести в консоль полученный в форме x. Для этого $Script:x достаточно. Для динамического взаимодействия, не закрывая формы используя Runspaces. В примере данные вводятся в текстовое поля, нажимается кнопка OK или клавиша Enter, введённые данные отображаются в надписи.
1
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
|
16.11.2020, 20:23 | 12 |
Вы так и не поняли. Вы даже не выходили за пределы дочерней формы, чтобы изобразить введённую строку на экране ... опять таки формы, а не основной программы.
$x должен появится здесь, накладываю его на последние две строки вашего кода: ..... $PowerShellCmd.Runspace = $RunSpace $PowerShellCmd.BeginInvoke() $x ---- вот он - желаемый результат, полученный из формы После всего кода, в основном потоке, а не в дочернем, не в дочерней форме Добавлено через 7 минут Это как inputBox, ввёл данные, получил результат. Понадобилась новая форма, открыл новую. Или эту же, из функции. И все окна, общаются с родительской программой, как в C# к примеру, где окна по умолчанию отдают данные в основную программу, которая затем может из передать в другое окно. Добавлено через 15 минут $RunSpace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace() $RunSpace.ApartmentState = "STA" $RunSpace.ThreadOptions = "ReuseThread" $RunSpace.Open() $RunSpace.SessionStateProxy.SetVariable("SyncHashTable", $Script:SyncHashTable) Начало очень похоже на то, что требуется - создать новый поток. Так как форма открылась, то можно сделать вывод, что она в новом потоке. В основном потоке она представлена в виде переменной $RunSpace. Теперь в дочерней форме нужно циклом пройтись по переменным основной программы, найти искомую переменную $x и отдать ей значение из TextBox. Результат будет в основной форме где то в недрах $RunSpace - общей для потоков переменной. Ну не совсем переменной - объекту. Добавлено через 4 минуты В $PowerShellCmd вернее, не в $RunSpace, хотя от этих потоков всего можно ожидать. Добавлено через 13 минут Да. Форма работает в новом потоке. В конце вашего примера дописал: echo 'exit' Основной поток написал exit и ...., ожидаемо закончил свою работу, так как он создал форму в другом потоке и она его больше не интересует. Но нас то ... интересует. Его нужно остановить циклом с паузой, чтобы оба потока работали одновременно. Когда основной поток, получит результат из дочернего, цикл прервать и продолжить выполнение основного потока. Форму можно закрывать, можно оставить открытой, для дальнейшей связи И напротив - В основном же примере, с которого началась эта ветка, в примере S1aanesh - поток застопоривается и естественно ничего не получит, потому, что он не работает вообще.
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
|||||||||||
11.12.2020, 00:43 | 13 | ||||||||||
Решение задачи оказалось банально простым. Нужна глобальная переменная $global:x.
Асинхронная форма:
Вообще асинхронная форма - вещь, когда речь идёт о длительных операциях. Например видео. Пока User думает как назвать свой супер-пупер файл, основной поток его "сделает" и запишет во временную директорию. Остаётся только вырезать его в нужное место и с нужным именем. Добавлено через 11 минут Странно. Не заметил ответ iNNOKENTIY21, уже озвучивший глобальную переменную для однопоточного режима. Браво. Про однопоточную форму оказывается я лишь продублировал. Многопоточную форму от iNNOKENTIY21 - привёл в "рабочее состояние". Добавлено через 1 час 11 минут Ещё одно, неожиданное для меня применение многопоточности. Есть у меня одно приложение, работающее с Excel, которое оставляет после себя процесс Excel незакрытым, и напрочь не хочет его закрывать ни при каких обстоятельствах. Вычитал на одном из форумов, что чтобы он закрылся, нужно корректное завершение скрипта. Не Kill it однозначно. Но у меня его окно явно лишнее среди взаимодействующих окон. Попробую-ка я его в другой процесс запустить и закончить корректно до "убийства" основного процесса. Ля. Итак после 2003 Экселя ничего хорошего с ним не сделали. Функционал тот же. Тормознутость в десятки раз больше, ещё и на ошибки чужие скрипты проверяют. Если это так, то они вообще ... чокнулись. Добавлено через 30 минут Убрал всплывающий в конце "MsgBox" - Excel стал закрываться в процессах. Здец!
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
|||||||||||
11.12.2020, 15:05 | 14 | ||||||||||
В конце лучше заменить цикл на
Добавлено через 4 часа 43 минуты Всё. От цикла избавился. Пользуйтесь.
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
||||||
11.04.2021, 14:25 | 15 | |||||
Можно несколько упростить логику возврата данных с формы, не используя промежуточные переменные, глобальные переменные, не присваивать им значения по клику, никаких $x, а просто ... закрыть форму по клику ... и смотреть уже потом, в основной программе, что же там было в возвращённой форме. Да. Именно в форме, которая уже не инициализирована, но имеет последние введённые в неё значения. Кроме того, её снова можно отправить на исполнение с прошлыми введёнными данными....
так как в данном случае, возвращается вся форма, все её значения, значения каждого элемента. (как то я не заметил этого ранее) Кроме того, саму форму, в принципе можно создавать в основном потоке, а на исполнение отправлять в обработчик, возвращающий результат. Сам обработчик можно оформить как функцию, возможно внешнюю ... тут уж кто во что горазд. Ниже код для формы в одном потоке, но нетрудно раскомментировать строки кода и установить $RunSpace.ThreadOptions = "ReuseThread" к примеру и код будет создавать новый поток.
0
|
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
|
|
11.04.2021, 22:21 | 16 |
@Garric спасибо за вариант . помоему такой подход страдает от необходимости раскапывать потом после форма уже закрылась детали ввода
которые могут быть запутаны ! например пользователь ввел интервал дат через календарь System.Windows.Forms.MonthCalendar а может фиксированный интервал через лист System.Windows.Forms.ListBox в котором выброано "последние две недели" и тому подобное - пример из реального приложения в котором еще всякие логины пароли энвайроменты и дата центры и другое - в обработчиках событий такие сценарии обрабатываются проще
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
||||||
12.04.2021, 23:17 | 17 | |||||
Вот, что я нашёл в инете. То же без промежуточных переменных. В принципе - рабочая версия той, нерабочей версии, с которой начинался топик.
skouzmine. Не вижу разницы. Причём вообще никакой разницы. Логика проверки введённых значений не изменится в любом случае. А вот логика присвоения значения поля определённой, строго заданной переменной, причём в разных событиях одновременно будет отсутствовать. Причём всё это сваливается сверху на проверку введённых значений, событий, необходимости обновлять значения в связанных полях ввода/вывода. Это очень сложный подход.
0
|
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
|
|
13.04.2021, 01:19 | 18 |
когда пользоваель хочет чтоб во время выбора парметров происходила бизнес логика то делать приходится в обработчике событий а не потом
0
|
1 / 1 / 0
Регистрация: 19.01.2019
Сообщений: 32
|
|
16.04.2021, 01:10 | 19 |
Само собой в обработчике. Проверил, не понравилось подкрасил или стёр поле, что такого. В чём твой смысл защищать глупую бессмысленную операцию копирования вывода в отдельную переменную?
Добавлено через 12 минут У меня складывается ощущение, что вы воспринимаете форму, возможно на основе опыта в Visual Studio, как нечто особенное, стоящее над или под кодом, так как имеет нечто вроде своего отдельного файла в Visual Studio. Нет, это просто код. Стерите все строчки формы из моего кода и вставьте обычный $Script:Table.x='Hello Word', и получайте результат в основной программе из параллельного потока. Она придёт оттуда как $Script:Table.x. Забрасывается туда $Script:Table = [Hashtable]::Synchronized(@{'x'=$x}) Добавлено через 7 минут И когда вы поймёте, как это работает, то вы заметите, что рядом могут находится многочисленные переменные формы $Script:Table.objTextBox.Text и т.д. Но если они все присутствуют вместе, для чего копирование?
0
|
504 / 157 / 49
Регистрация: 27.02.2016
Сообщений: 811
|
|
17.04.2021, 05:49 | 20 |
честно говоря, из вашего поста тяжело понять вашу мысль и что-то вы меня не убедили..
0
|
17.04.2021, 05:49 | |
17.04.2021, 05:49 | |
Помогаю со студенческими работами здесь
20
Используя диалоговые окна ввода и вывода необходимо создать web- страницу для вычисления значений функций Организация ввода/вывода информации Контроль ввода вывода информации Вопрос: создание окон (в графическом или текстовом режиме) для ввода исходной информации. Неполадки ввода-вывода информации с диска Компоненты ввода-вывода текстовой информации Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |