VBS: Запуск скрипта через реестр по требованию
Задача
Есть файл произвольного имени в произвольном месте. Требуется провести с ним определенные манипуляции. Скрипт, который это делает — есть.
Хочу модифицировать его так, чтобы кликаешь по файлу правой кнопкой — выбираешь команду и запускается скрипт.
Создал в разделе реестра HKEY_CLASSES_ROOT строку [тип файла]/shell/[команда]/command/
вопрос в том как грамотно прописать (по умолчанию) чтобы он запускал скрипт
всегда ругается что приложение не является win32.
Можно как-то это сделать так, чтобы скрипт потом еще получал ссылку на файл? (как понял в реестре путь к файлу это %1)
2 Ответ от Rom5 2011-10-10 14:43:05
Re: VBS: Запуск скрипта через реестр по требованию
D-VenZ пишет:
Скрипт, который это делает — есть.
Хочу модифицировать его так, чтобы кликаешь по файлу правой кнопкой — выбираешь команду и запускается скрипт.
[..]
Если один скрипт должен выполнять разные действия, то выбрать это действие можно и в самом скрипте, при условии, что вариантов действий нужно не более , например, 3-4х — выводом диалога Yes/No/Cancel — и в тексте диалога кратко расписать значение нажимаемых клавиш, от выбранной клавиши и сделать ветвление в скрипте.
Вариант, если скрипт один, но разнообразие действий поболее 3-х, прийдется написать в скрипте разбор аргументов для ветвления по полученному извне параметру.
А вызов скрипта с разными параметрами также можно организовать очень по разному.
Вот, идея, при которой не надо вручную править реестр — для каждого варианта аргумента сделать свой батник, который стартует с скрипт с передачей аргумента — имени обрабатываемого файла (%1) и со своим параметром-ключем. Батник назвать, например, «myProg_case1 (add blablabla).cmd», ярлык на батник поместить в SendTo своего пользователя.
Тело батника, например, такое:
wscript.exe myScript.vbs "%1" -add
В скрипте обрабатываем к примеру последний аргумент — сравниваем с ожидаемыми значениями — «-add» или «-del» и прочими, а предпоследним аргументом будет обрабатываемый файл.
Вывод уведомлений пользователям из скриптов PowerShell
12.04.2024
itpro
PowerShell, Windows 10
комментариев 30
Для оповещения пользователей о различных событиях, вы можете выводить различные графические уведомления из скриптов PowerShell. В PowerShell можно использовать всплывающие уведомления в трее Windows или модальные окно для получения информации от пользователя или подтверждения действия.
Вывести всплывающее сообщение на экран с помощью PowerShell
Для вывода простых модального диалогового окна в Windows можно воспользоваться Wscript классами подсистемы сценариев Windows. Следующий PowerShell код выведет обычное текстовое окно с вашим текстом и кнопкой OK.
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup(«Скрипт формирования отчета выполнен»)
Вы можете настроить вид модального окна такого сообщения и добавить кнопки действия для пользователей. Например, чтобы вывести всплывающее окно с кнопками Да и Нет, выполните:
$Output = $wshell.Popup(«Скрипт формирования отчета завершен! Хотите вывести его на экран?»,0,»Отчет готов»,4+32)
Если пользователь нажмет Да, команда вернет значение 6 , а если Нет – 7 .
В зависимости от выбора пользователя вы можете выполнить какое-то действие, или завершить скрипт.
switch ($Output) < 7 <$wshell.Popup('Нажата Нет')>6 <$wshell.Popup('Нажата Да')>default <$wshell.Popup('Неверный ввод')>>
Общий синтаксис и параметры метода Popup:
- — текст сообщения.
- — необязательный, число. Количество секунд, по истечении которого окно будет автоматически закрыто.
- — текст заголовка окна сообщения (необязательный параметр).
- — комбинация флагов, определяет тип кнопок и вид значка (числовое значение, не обязательный параметр). Возможные значения флагов:
- 0 — кнопка ОК.
- 1 — кнопки ОК и Отмена.
- 2 — кнопки Стоп, Повтор, Пропустить.
- 3 — кнопки Да, Нет, Отмена.
- 4 — кнопки Да и Нет.
- 5 — кнопки Повтор и Отмена.
- 16 — значок Stop.
Команда PowerShell возвращает целое значение, с помощью которого можно узнать, какая кнопка была нажата пользователем. Возможные значения:
- -1 — таймаут.
- 1 — кнопка ОК.
- 2 — кнопка Отмена.
- 3 — кнопка Стоп.
- 4 — кнопка Повтор.
- 5 — кнопка Пропустить.
- 6 — кнопка Да.
- 7 — кнопка Нет.
Если нужно показать пользователю окно ввода и запросить данные, воспользуйтесь классом Windows Forms.
Add-Type -AssemblyName System.Windows.Forms
$input = [Microsoft.VisualBasic.Interaction]::InputBox(«Введите имя пользователя:», «Запрос данных», «»)Чтобы обработать введенные пользователе данные:
if ([string]::IsNullOrWhiteSpace($input)) Write-Host «Данные не указаны» > else
Если нужно вывести всплывающее окно поверх всех окон, используйте команду:
($ModalTop = New-Object ‘System.Windows.Forms.Form’ ).TopMost = $True
[System.Windows.Forms.MessageBox]::Show($ModalTop,»Текст», «Заголовок», 4, 48)Вывести уведомление пользователю Windows из скрипта PowerShell
С помощью класса Windows Forms можно вывести более красивые всплывающие сообщения (ballons). Следующий скрипт выведет всплывающее сообщение рядом с панелью уведомлений Windows, которое автоматически исчезнет через 10 секунд:
Add-Type -AssemblyName System.Windows.Forms
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balmsg.BalloonTipText = ‘Это текст всплывающего сообщения для пользователя Windows 10’
$balmsg.BalloonTipTitle = «Внимание $Env:USERNAME»
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(10000)Для создания красочных всплывающих сообщений в Windows можно использовать отдельный PowerShell модуль BurntToast.
Установите модуля из PowerShell Gallery:
Install-Module -Name BurntToast
Теперь, например, в ранее рассматриваемый скрипт автоматического отключения от Wi-FI сети при подключении к Ethernet можно добавить уведомление с картинкой:
New-BurntToastNotification -Text «Отключение от Wi-Fi сети», «Вы были отключены от Wi-Fi сети, т.к. Вше устройство было подключено к скоростному Ethernet подключению.» -AppLogo C:\PS\changenetwork.png
PowerShell: отправка сообщения пользователю на удаленный компьютер
С помощью PowerShell вы можете отправить всплывающее сообщение пользователю на удаленный компьютер. Сначала нужно получить список сессии пользователей на удаленном компьютере (в случае RDS сервера):
Чтобы отправить сообщение в сессию пользователя на удаленном компьютер, выполните команду:
MSG kbuldogov /server:rds1 «Сервер будет перезагружен через 10 минут. Закройте документы»
Если всплывающее сообщение нужно отправить всем пользователям укажите * вместо имени пользователя:
MSG * /server:rds1 «Срочное сообщение всем! «
Для отправки всплывающего графического уведомления на удаленный компьютер можно воспользоваться скриптом RemoteSendToasNotification.ps1 из нашего GitHub репозитория ( https://github.com/winadm/posh/blob/master/scripts/RemoteSendToasNotification.ps1). Для подключения к удаленному компьютеру используется командлет Invoke-Command, который использует WinRM.
Предыдущая статья Следующая статья
Оператор AppActivate
Синтаксис оператора AppActivate состоит из следующих именованных аргументов:
Part Описание заголовок Обязательно. Строковое выражение, указывающее заголовок в строке заголовка окна приложения, которое необходимо сделать активным. Для активации приложения на месте заголовка может использоваться идентификатор задачи, возвращаемый функцией Shell. wait Необязательный параметр. Логическое значение, указывающее наличие фокуса в вызывающем приложении перед активацией другого. При значении False (по умолчанию) указанное приложение сразу становится активным, даже если вызывающее приложение не имеет фокуса. Если задано значение True, вызывающее приложение ожидает, пока оно не перейдет в фокус, а затем активирует указанное приложение. Замечания
Оператор AppActivate перемещает фокус на именованное приложение или окно, но не влияет на его размер. Если пользователь выполняет некоторые действия, чтобы изменить фокус или закрыть окно, фокус перемещается с окна активированного приложения. Для запуска приложения и выбора стиля окна используйте функцию Shell.
В определении того, какое приложение сделать активным, title сравнивается со строкой заголовка каждого запущенного приложения. Если точного соответствия нет, активируется любое приложение, строка заголовка которого начинается с title. Если сразу несколько приложений имеют имя title, одно из них активизируется произвольным образом.
Пример
В этом примере показаны различные варианты использования оператора AppActivate для активации окна приложения. Операторы оболочки предполагают, что приложения находятся по указанным путям. В macOS диск по умолчанию обозначается «HD», а части аргумента «путь» отделяются друг от друга двоеточиями вместо обратной косой черты.
Dim MyAppID, ReturnValue AppActivate "Microsoft Word" ' Activate Microsoft ' Word. ' AppActivate can also use the return value of the Shell function. MyAppID = Shell("C:\WORD\WINWORD.EXE", 1) ' Run Microsoft Word. AppActivate MyAppID ' Activate Microsoft ' Word. ' You can also use the return value of the Shell function. ReturnValue = Shell("c:\EXCEL\EXCEL.EXE",1) ' Run Microsoft Excel. AppActivate ReturnValue ' Activate Microsoft ' Excel.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
VBS диалог с пользователем
батник-билдер формирует другой батник (installer.bat) и через psexec рассылается на компы пользователей и выполняется в тихом режиме (для пользователей выводится только инфа о начале и окончании работы скрипта через MSG). В целом, все устраивает, но бывает так, что пользователь не может ждать, пока будет выполняться работа скрипта (т.е. нужно или отменить или отложить его выполнение).
В связи с чем возник вопрос: можно ли сделать какое-то подобие диалога с пользователем (например на VBS, WSH, HTA или еще как-то.. я ни с чем этим дела не имел), чтобы после доставки батника на конечный комп перед началом его выполнения у пользователя появлялось окно с кнопками и возможностью выбора, например: начать установку, отложить установку (чтобы скажем, при нажатии этой кнопы диалог закрылся, но включился бы таймер и по истечении времени диалог появился бы снова) и отмена установки, при нажатии на которую все файлы, переданные на комп, были бы удалены.такое вообще возможно реализовать скриптами? или это будет слишком сложно и громоздко и лучше не заморачиваться? нагромождать туеву хучу файлов не хотелось бы, крайне желательно обойтись минимумом.