Powershell + XAML + 搜索框 + 抓取显示

Powershell + XAML + Search Box + capture and display

我的程序即将完成,需要一些帮助才能越过终点线。应该做的是在预定义目录中搜索日志文件。我在搜索框中输入的文本和使用我创建的按钮执行搜索时都没有任何反应。我已经搜索了整个 Internet,据我所知。我在 Winforms 中看到很多示例,但我不知道 Winforms 和 WPF 之间的“转换”。

我认为如果有人能让我通过这个障碍,我就可以实现我想添加的其他功能。

PS:我真的没有编程功底,就是有韧劲

提前感谢所有提供帮助的人。

'''

    # Import needed Assemblies
    Add-Type -AssemblyName PresentationCore, PresentationFramework, WindowsBase, 
    System.Drawing, System.Windows.Forms, WindowsFormsIntegration
    [void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework')
    [Windows.Forms.Application]::EnableVisualStyles()

    #XAML form designed using Visual Studio
    # Build the GUI
    [xml]$Form = @"
    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                
                    Title="Log Crawler"
                    HorizontalAlignment="Center"
                    FontSize="11" Height="700" Width="1300" FontFamily="Calibri"
                    WindowStartupLocation="CenterScreen"
                    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                    ScrollViewer.VerticalScrollBarVisibility="Disabled" WindowStyle="ThreeDBorderWindow">

                <Grid Margin="0,0,0,0">
                    <Grid.Background>
                            <LinearGradientBrush EndPoint="0.8,1" StartPoint="0.8,0">
                                    <GradientStop Color="Black"/>
                                    <GradientStop Color="White" Offset="1"/>
                            </LinearGradientBrush>
                    </Grid.Background>
                    
                    <TextBox x:Name="IntegrationsLogCrawler" Text="Integration Log Crawler" 
                                     HorizontalAlignment="Center" VerticalAlignment="Top" TextAlignment="Center" TextWrapping="NoWrap" 
                                     Margin="0,20,0,0 " Height="37" Width="260" 
                                     FontSize="24" FontFamily="Calibri" FontWeight="Bold" FontStyle="Normal" FlowDirection="LeftToRight"/>

                    <GroupBox x:Name="SearchBox" Header="SearchBox"
                                     HorizontalAlignment="Center" VerticalAlignment="Top"
                                     FontSize="12" FontFamily="Calibri" FontWeight="Bold" Foreground="#FFE4E41A"
                                     Margin="0,100,0,0" Height="40" Width="400">

                    <TextBox x:Name="InputBox" TextWrapping="NoWrap"/>
                    </GroupBox>

                    <Button x:Name="LogCrawl" Content="Log Crawl" 
                                    HorizontalAlignment="Center" VerticalAlignment="Top"
                                    Margin="0,150,0,0" Height="40" Width="190"
                                    FontSize="18" FontFamily="Calibri" FontWeight="Bold" Foreground="#FFEE0C3F"/>
                    
                    <Button x:Name="Exit" Content="Exit" 
                                    HorizontalAlignment="Center" VerticalAlignment="Top" 
                                    Margin="0,200,0,0" Height="39" Width="110" 
                                    FontSize="16" FontFamily="Calibri" FontWeight="Bold" Foreground="#FFE4E41A" Background="#FF040404"/>
                    
                    <GroupBox x:Name="Results" Header="Results"
                                     HorizontalAlignment="Center" VerticalAlignment="Top" 
                                     FontSize="12" FontFamily="Calibri" FontWeight="Bold" Foreground="#FFE4E41A"
                                     Margin="0,250,0,0 " Height="250" Width="1000">

                    <TextBox x:Name="OutputBox" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"/>
                    </GroupBox>
            </Grid>
    </Window>
    "@

    #Create a form
    $XMLReader = (New-Object System.Xml.XmlNodeReader  $Form)
    $XMLForm = [Windows.Markup.XamlReader]::Load($XMLReader)


    #Connect to Controls 
    $xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]")  | ForEach {
    New-Variable  -Name $_.Name -Value $XMLForm.FindName($_.Name) -Force
    }

    #   Load Log Crawl Menu Button Controls
    $InputBox = $XMLForm.FindName('InputBox')
    $OutputBox = $XMLForm.FindName('OutputBox')
    $LogCrawl = $XMLForm.FindName('LogCrawl')
    $Exit = $XMLForm.FindName('Exit')

    # Logfile Location
    $LogFiles = "$($ENV:USERPROFILE)\Documents\_data\logfiles"


    #   Log Crawl Button Action
    $LogCrawl1.Add_Click({ 
    Select-String  -Path "$LogFiles\*.*"  -Pattern  $InputBox  -Context 10, 20   |  Write-Host
    })


    # EXIT
    $Exit.Add_Click({
            $XMLForm.Close()
    })

    #Show XMLform
    $null = $XMLForm.ShowDialog()

'''

我不确定这部分的工作原理(给了我例外“你不能在空值表达式上调用方法。”):

#Connect to Controls 
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]")  | ForEach {
New-Variable  -Name $_.Name -Value $XMLForm.FindName($_.Name) -Force
}

我认为你应该删除它。

然后你把按钮变量名打错了$LogCrawl1 --> $LogCrawl,还把Add_Click()方法改成:

#  Log Crawl Button Action
$LogCrawl.Add_Click({ 
    # Logfile Location
    $LogFiles = "$($ENV:USERPROFILE)\Documents\_data\logfiles"
    $OutputBox.Text = Select-String -Path "$LogFiles\*.*" -Pattern $InputBox.Text -SimpleMatch -Context 10, 20
})

P.S。目前还不清楚这是否也在您的真实代码中,但是 XAML 此处字符串的最终结束 "@ 必须 而不是 左侧有空格。