Как открыть форму WPF через фоновое задание PowerShell? - PullRequest
0 голосов
/ 21 июня 2020

Я ищу возможность открыть форму WPF через фоновое задание PowerShell.

Я пробовал другой метод, но не смог. Итак, ищу вашей помощи.

Я мог бы вывести обычную форму windows, но проблемы возникают, когда я решаю использовать WPF. Код работает нормально без фонового задания.

Вот мой полный код PowerShell, который будет работать в фоновом режиме. Ваша помощь будет очень признательна. Заранее спасибо.

Приведенный ниже код сохранен в файле "BackgroundJob.ps1". И этот файл вызывается из функции Show-Popups, упомянутой ниже.

[cmdletbinding()]
Param($TaskName,$ScriptPath)

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')



[xml]$xaml =@"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFScrollViewerSample" 
Name="window" WindowStyle="None" Height="250" Width="500"
ResizeMode="noresize" ShowInTaskbar="False" WindowStartupLocation="Manual"  
    >

<Window.Resources>
    <Style TargetType="GridViewColumnHeader">
        
        <Setter Property="Background" Value="Transparent" />
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GridViewColumnHeader">
                <Border Background="#313130">
                    <ContentPresenter></ContentPresenter>
                </Border>
                </ControlTemplate>
            </Setter.Value>
          </Setter>
    </Style>


</Window.Resources>
          
    <Grid Name="grid" Background="#313130" Height="250" Width="500">


        <Label Name="Label" Content="" Foreground="White" FontSize="15" Margin="70,100,0,0"/>


        

        <Button Name="Dismiss" Content="Dismiss" HorizontalAlignment="Left" Margin="250,170,0,0" VerticalAlignment="Top" Width="80" Height="24" Background="Gray" Foreground="White"/>
        <Button Name="Yes" Content="Yes" HorizontalAlignment="Left" Margin="150,170,0,0" VerticalAlignment="Top" Width="80" Height="24" Background="Gray" Foreground="White"/>

    </Grid>


</Window>
"@

$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
try{$Pop_op=[Windows.Markup.XamlReader]::Load( $reader )}
catch{Write-Host "Unable to load Windows.Markup.XamlReader."; break}
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name ($_.Name) -Value $Pop_op.FindName($_.Name)}

#Yes Button Event
$Yes.add_click({
       #Import data in DB
        #Export Runtime Logs
        if([string]::IsNullOrEmpty($Error)){
                $Error  | Out-File -FilePath "$env:temp\RuntimeError.log"  -Force -Append 
            }
        $Error.Clear()
        #Close Form
        $Pop_op.Close()            
                        
})
#Dismiss Button Event
$Dismiss.add_click({
        $Pop_op.Close()
})



$Pop_op.Left = $([System.Windows.SystemParameters]::WorkArea.Width-$Pop_op.Width)
$Pop_op.Top = $([System.Windows.SystemParameters]::WorkArea.Height-$Pop_op.Height)
$Label.Content ='Do you wants to perform '+$TaskName + '?'


#$Pop_op.Show();$Pop_op.Activate()
$Pop_op.ShowDialog() #| Out-Null
if([string]::IsNullOrEmpty($Error)){
                $Error  | Out-File -FilePath "$env:temp\RuntimeError.log"  -Force -Append 
            }



Вот код для создания фонового задания

Start-Job -ScriptBlock {   
    Import-Module "C:\Data\MyFunctions.ps1" -Force
    Show-Popups -ScriptPath 'C:\Data'
  
}

Show-Popups - это функция для вызова фона Powershell скрипт задания "BackgroundJob.ps1".

1 Ответ

0 голосов
/ 23 июня 2020

Я решил эту проблему с помощью обходного метода.

Решение:

  1. Создайте сценарий VB и запустите через него сценарий PS.
  2. Вызовите VB с использованием Wscript.exe

Код VBs:

command = "PowerShell.exe -executionpolicy Bypass -file C:\script.ps1"

set shell = CreateObject("WScript.Shell")

shell.Run command,0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...