Скрипт PowerShell для отображения всплывающей подсказки и выполнения действий работает только в графическом интерфейсе ISE, а не из командной строки - PullRequest
3 голосов
/ 22 марта 2011

Я видел кучу тесно связанных постов, так что я знаю, что я не одинок, но никто не дал мне ответ, который я ищу.Приносим извинения, если об этом спросили и ответили, а я не смог его найти.

этот сценарий создает настраиваемую область уведомлений, которая, если щелкнуть по ней, предназначена для открытия нового окна IE для какого-либо URL.Прекрасно работает с графическим интерфейсом PowerShell ISE, в котором я с ним работал. Невозможно заставить его работать из командной строки, используя какие-либо опции, которые я видел в других постах.В частности, не может заставить окно IE открыться .Уведомление появляется без проблем, но нет окна IE ... ??Пробовал с:

  • powershell.script.ps1
  • powershell -file script.ps1
  • команда
  • &

и т. д.

Мысли?

Мой скрипт:

#Load the required assemblies
[void] [System.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)
#Remove any registered events related to notifications
Remove-Event BalloonClicked_event -ea SilentlyContinue
Unregister-Event -SourceIdentifier BalloonClicked_event -ea silentlycontinue
Remove-Event BalloonClosed_event -ea SilentlyContinue
Unregister-Event -SourceIdentifier BalloonClosed_event -ea silentlycontinue
Remove-Event Disposed -ea SilentlyContinue
Unregister-Event -SourceIdentifier Disposed -ea silentlycontinue

#Create the notification object
$notification = New-Object System.Windows.Forms.NotifyIcon 
#Define various parts of the notification
$notification.Icon = [System.Drawing.SystemIcons]::Information
$notification.BalloonTipTitle = “**Reminder**”
$notification.BalloonTipIcon = “Warning”
$title = “message to user”
$notification.BalloonTipText = $title

#Make balloon tip visible when called
$notification.Visible = $True

## Register a click event with action to take based on event
#Balloon message clicked
register-objectevent $notification BalloonTipClicked BalloonClicked_event -Action {
    Start-Process 'c:\Program Files\Internet Explorer\iexplore.exe' -ArgumentList 'http://someURL.com' -WindowStyle Maximized -Verb Open
    #Get rid of the icon after action is taken
    $notification.Dispose()
    } | Out-Null

#Balloon message closed
register-objectevent $notification BalloonTipClosed BalloonClosed_event -Action {$notification.Dispose()} | Out-Null

#Call the balloon notification
$notification.ShowBalloonTip(1000)

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

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

Это можно исправить одним из двух способов:

  • добавить сон (1) в конец скрипта, чтобы он не заканчивался до того, как пользователь щелкнет по шарику; (при необходимости увеличьте значение, хотя я тестировал с 1 сек просто отлично)
  • используйте параметр командной строки -noexit и затем программно закрывайте powershell после нажатия пользователем уведомления или после некоторой задержки (я проверял, что он запустит IE без изменений в вашем коде, не потрудившись кодировать выходную часть.)
1 голос
/ 22 марта 2011

Изменено на C # с помощью настоящего разработчика.Буду признателен за истинный ответ PowerShell, если у кого-то есть.

Новый код:

$code = @'
using System;
using System.Drawing;
using System.Windows.Forms;

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        NotifyIcon nicon = new NotifyIcon();
        nicon.BalloonTipIcon = ToolTipIcon.Info;
        nicon.BalloonTipText = "message to user";
        nicon.BalloonTipTitle = "*** title for user ***";
        nicon.Icon = SystemIcons.Information;
        nicon.BalloonTipClicked += (sender, e) =>
        {
            System.Diagnostics.Process.Start("http://website.com");
            CleanUp(nicon);
        };
        nicon.BalloonTipClosed += (sender, e) => CleanUp(nicon);
        nicon.Visible = true;
        nicon.ShowBalloonTip(1000 * 1);
        Application.Run();
    }
    static void CleanUp(NotifyIcon c)
    {
        c.Visible = false;
        c.Dispose();
        Application.Exit();
    }
}

'@
Write-Host $code
Add-Type -OutputType WindowsApplication -OutputAssembly c:\temp\test.exe -TypeDefinition  $code -ReferencedAssemblies "System.Drawing","System.Windows.Forms" -Language CSharpVersion3
0 голосов
/ 22 марта 2011

Я полагаю, что решение состоит в том, чтобы запустить PowerShell.exe (т. Е. Окно консоли) с параметром -sta.

Код GUI Windows должен выполняться в потоке, установленном как COM «Однопоточная квартира»(STA), но по умолчанию рабочий поток в консоли PowerShell выполняется в «многопоточной квартире» (MTA).

...