我正在寻找一个通过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”的函数。
1条答案
按热度按时间i1icjdpr1#
我已经通过一些变通方法解决了这个问题。
解决方法:
1.创建VB脚本,并通过它运行PS脚本。
1.使用Wscript.exe调用VB
VB代码: