【问题标题】:Powershell: Output a search from a csv to a small guiPowershell:将搜索从 csv 输出到小 gui
【发布时间】:2022-09-27 19:03:08
【问题描述】:

也许你们中的一位专家可以帮助一个完整的新手(我不知道我想要的是否可行)。 假设我有一个包含各种数据的 CSV 文件。 (见 csv_screenshot)csv_screenshot

我通过 Powershell 将这些数据导入到一个小的 GUI 中。我怎样才能做到这一点,当我搜索“巴黎”时,我真的只能在 GUI 中以列表视图的形式获得巴黎的输出(参见 powershell_screenshot)

powershell_screenshot

目前,GUI 中的输出如下所示(参见 current_result.png)。我如何将它很好地格式化为那里的列表。我真的很想像这样插入它(通过 Out Grid View 没问题) current_result.png

[void] [System.Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\")
[void] [System.Windows.Forms.Application]::EnableVisualStyles();

function search_csv {
    $Input = $textbox_Search.text
    $Input = \"*$Input*\"
    $Input_Result  = import-csv -path C:\\Users\\check.csv -Header \"Location\", \"Client\", \"Mobile Device\" 
    $output_TextBox.text = $Input_Result -like $Input 
   
  
}

$search_csvtool = New-Object System.Windows.Forms.Form
    $search_csvtool.Text = \"CSV Search\"
    $search_csvtool.Size = New-Object System.Drawing.Size(674,500)
    $search_csvtool.FormBorderStyle =\"FixedDialog\"
    $search_csvtool.TopMost = $true
    $search_csvtool.MaximizeBox = $false
    $search_csvtool.MinimizeBox = $true
    $search_csvtool.ControlBox = $true
    $search_csvtool.StartPosition = \"CenterScreen\"
    $search_csvtool.Font = \"Courier New\"

$label_Search = New-Object System.Windows.Forms.Label
    $label_Search.Location = New-Object System.Drawing.Size(195,18)
    $label_Search.Size = New-Object System.Drawing.Size(265,32)
    $label_Search.TextAlign =\"MiddleCenter\"
    $label_Search.Text = \"Please enter \"
    $search_csvtool.Controls.Add($label_Search)

$textbox_Search = New-Object System.Windows.Forms.TextBox
    $textbox_Search.Location = New-Object System.Drawing.Size(195,50)
    $textbox_Search.Size = New-Object System.Drawing.Size(266,37)
    $search_csvtool.Controls.Add($textbox_Search)

$button_Search = New-Object System.Windows.Forms.Button
    $button_Search.Location = New-Object System.Drawing.Size(195,80)
    $button_Search.Size = New-Object System.Drawing.Size(266,24)
    $button_Search.TextAlign = \"MiddleCenter\"
    $button_Search.Text = \"Search\"
    $button_Search.Add_Click({search_csv})
    $search_csvtool.Controls.Add($button_Search)

$output_TextBox = New-Object System.Windows.Forms.TextBox
    $output_TextBox.Multiline = $true;
    $output_TextBox.Location = New-Object System.Drawing.Size(16,130)
    $output_TextBox.Size = New-Object System.Drawing.Size(627,314)
    $output_TextBox.ScrollBars = \"Vertical\"
    $output_TextBox.ReadOnly = $true;
    $search_csvtool.Controls.Add($output_TextBox)

    $search_csvtool.Add_Shown({$search_csvtool.Activate()})
    [void] $search_csvtool.ShowDialog()
  • 我猜您希望使用| Format-List | Out-String 格式化您的结果。提示 1:不要使用变量名$Input,因为那是Automatic variable。为此选择另一个名称。提示 2:在您的代码中只导入一次 CSV,而不是每次调用函数 search_csv 时。提示 3: 使用Add-Type -AssemblyName System.Windows.Forms 而不是古老的LoadWithPartialName() 方法
  • 首先感谢您的提示。我已经采纳了你的建议。我已经测试过 Format-List | Out-String 之前。结果相同。 GUI 中的输出仍未格式化为列表(参见 current_result.png)

标签: powershell


【解决方案1】:

好的,这就是我在评论中的意思:

开始代码

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$csvData = Import-Csv -path 'C:\Users\check.csv' -Header "Location", "Client", "Mobile Device" 

function search_csv {
    $searchThis = $textbox_Search.Text.Trim()
    # use $script: scoping here to reference the $csvData variable
    $data = $script:csvData | Where-Object {$_.Location -like "*$searchThis*"}
    if ($data) {
        $output_TextBox.Text = ($data | Format-List | Out-String).Trim()
    }
    else {
        $output_TextBox.Text = "Not found.."
    }
}

然后像你一样创建表单的其余部分。
重要提示:使用最后一个新代码行完成后销毁表单:

$search_csvtool.Dispose()

然后你应该有这个结果:


根据您在未输入任何内容(或仅输入空格)时清空文本框的评论,您可以将函数更改为:

function search_csv {
    $searchThis = $textbox_Search.Text.Trim()
    # use $script: scoping here to reference the $csvData variable
    $data = $script:csvData | Where-Object {$_.Location -like "*$searchThis*"}
    if ([string]::IsNullOrWhiteSpace($searchThis)) {
        $output_TextBox.Clear()
    }
    elseif ($data) {
        $output_TextBox.Text = ($data | Format-List | Out-String).Trim()
    }
    else {
        $output_TextBox.Text = "Not found.."
    }
}

但是,正如postanote 已经评论的那样,最好简单地禁用搜索按钮并仅在输入其他空格时才启用它。

为此,您需要向文本框添加一个事件处理程序:

$textbox_Search = New-Object System.Windows.Forms.TextBox
$textbox_Search.Location = New-Object System.Drawing.Size(195,50)
$textbox_Search.Size = New-Object System.Drawing.Size(266,37)
$textbox_Search.Add_TextChanged({
    # enable the button when there is at least one non-whitespace character present
    $button_Search.Enabled = $this.Text -match '\S'
    # or use
    # $button_Search.Enabled = (-not [string]::IsNullOrWhiteSpace($this.Text))
})
$search_csvtool.Controls.Add($textbox_Search)

并将按钮初始化为禁用启动时:

$button_Search = New-Object System.Windows.Forms.Button
$button_Search.Location = New-Object System.Drawing.Size(195,80)
$button_Search.Size = New-Object System.Drawing.Size(266,24)
$button_Search.TextAlign = "MiddleCenter"
$button_Search.Text = "Search"
# initialize to Disabled; will be enabled as soon as there is text entered in the $textbox_Search
$button_Search.Enabled = $false  
$button_Search.Add_Click({search_csv})
$search_csvtool.Controls.Add($button_Search)

在事件处理程序中,您可以使用自动变量 $this 引用对象本身

【讨论】:

  • 天哪,西奥迈出了一小步,我迈出了一大步。我承认,我不会想到的。这更加激励我坚持下去。我通过 -or 输入了另一个条件。感谢您的帮助和启发!安可:你有什么提示吗,如果我不输入搜索词并按下按钮,我可以做什么以使输出保持空白?
  • @DaRockwilda83 当然,只有我现在在手机上,所以可能稍后或明天
  • 至于这个你有什么提示吗,如果我不输入搜索词并按下按钮,我能做些什么以使输出保持空白?只需使用条件逻辑(if/the 或 try catch 或 -match 等)来检查 $null 并根据需要进行处理。虽然不确定为什么有人会在从未问过问题时故意要求结果。这意味着这与不输入搜索条件相同。从纯 GUI 的角度来看,理想情况下,在搜索框中输入某些内容之前,该搜索按钮甚至不应该处于活动状态, 以避免完全混淆。
  • @DaRockwilda83 请查看我的编辑。作为该平台的新手,请允许我将您指向tour,其中您可以看到如何在答案解决您的问题时将问题标记为“完成”。
  • 非常感谢建设性的帮助!这肯定澄清了很多。一切都很顺利。谢谢
【解决方案2】:

根据此处的答案和提示,我能够扩展并几乎完成我的迷你项目。一件小事仍然困扰着我的输出。是否有可能删除输出中的空格(请参阅屏幕截图中的标记)?我希望它们采用以下格式:

screenshot

站点ID:ABCD 地点:伦敦

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2013-06-26
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多