如何通过PowerShell后台作业弹出WPF表单?

qlckcl4x  于 2022-12-05  发布在  Shell
关注(0)|答案(1)|浏览(137)

我正在寻找一个通过PowerShell后台作业弹出WPF表单的选项。
我尝试了不同的方法,但失败了。所以,寻求你的帮助。
我可以弹出正常的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”的函数。

i1icjdpr

i1icjdpr1#

我已经通过一些变通方法解决了这个问题。
解决方法:
1.创建VB脚本,并通过它运行PS脚本。
1.使用Wscript.exe调用VB
VB代码:

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

set shell = CreateObject("WScript.Shell")

shell.Run command,0

相关问题