如何自动创建复选框取决于使用PowerShell选择的文件夹?

如何自动创建复选框取决于使用PowerShell选择的文件夹?,powershell,user-interface,checkbox,Powershell,User Interface,Checkbox,我需要根据我选择的文件夹自动创建一个复选框。我创建ComboBox,然后在ComboBox中,我可以选择要选择的文件夹。在我的文件夹里,我有一些文件。该文件由一些扩展文件组成。我只需要从文件夹中选择2个扩展名文件,例如*.txt和*.csv 选择文件夹后,复选框将自动创建,复选框的总数取决于该文件夹中存在多少具有特定扩展名*.txt和*.csv的文件 在我的代码中,我已经做了一些事情,那就是选择我需要选择的文件夹,但仍在与复选框斗争。任何人都可以帮我。非常感谢你。我真的很感谢你的帮助 我把我的脚

我需要根据我选择的文件夹自动创建一个复选框。我创建ComboBox,然后在ComboBox中,我可以选择要选择的文件夹。在我的文件夹里,我有一些文件。该文件由一些扩展文件组成。我只需要从文件夹中选择2个扩展名文件,例如*.txt和*.csv

选择文件夹后,复选框将自动创建,复选框的总数取决于该文件夹中存在多少具有特定扩展名*.txt和*.csv的文件

在我的代码中,我已经做了一些事情,那就是选择我需要选择的文件夹,但仍在与复选框斗争。任何人都可以帮我。非常感谢你。我真的很感谢你的帮助

我把我的脚本放在第二个更新版中

更新 考虑@f6a4答案,这就是结果 第一张图片是我只是使用这个路径来获取文件夹

'D:\Data\'
在第一张图片中,我已经双击了folder1和folder2,但是文件没有出现

第二张图片,我指定了文件夹路径

'D:\Data\folder1'
第二张图片显示的是文件,因为我在路径中指定了文件夹,所以文件夹名称不会出现在“请选择文件夹”框中,并返回此错误$CTRL\u ListFolder.Items.AddRange Get ChildItem-path$GH.CurrentFold。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:NotSpecified::[],MethodInvocationException +FullyQualifiedErrorId:ArgumentNullException

2n更新 我更新了我的脚本。但是,当我单击文件夹时,该文件仅显示1。当我更改为单击其他文件夹时,它不会显示在文件中

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

$Global:status = "inactive" 
$Global:array = New-Object System.Collections.Generic.List[System.Object]

$Form                            = New-Object system.Windows.Forms.Form
$Form.text                       = "BPS Image Automation Utility"
$Form.BackColor                  = "#f6f6f6"
$Form.AutoSize                   = $true
$Form.FormBorderStyle            = "FixedDialog"
$Form.MaximizeBox                = $false
$Form.startposition              = "centerscreen"
$Form.WindowState                = 'Maximized'

$Label1                          = New-Object system.Windows.Forms.Label
$Label1.text                     = "Please select the image"
$Label1.AutoSize                 = $true
$Label1.width                    = 25
$Label1.height                   = 10
$Label1.location                 = New-Object System.Drawing.Point(50,50)
$Label1.Font                     = 'Microsoft Sans Serif,10'
$Label1.ForeColor                = "#000000"
$label1.AutoSize                 = $true

$Button3                         = New-Object system.Windows.Forms.Button
$Button3.BackColor               = "#136aa4"
$Button3.ForeColor               = "#ffffff"
$Button3.text                    = "Done"
$Button3.width                   = 90
$Button3.height                  = 32
$Button3.AutoSize = $true
$Button3.UseCompatibleTextRendering = $True
$Button3.UseVisualStyleBackColor = $False
# $Button3.location                = New-Object System.Drawing.Point(1700,920)
$Button3.Font                    = 'Microsoft Sans Serif,10'
# $Button3.Visible                 = $false

$Button2                         = New-Object system.Windows.Forms.Button
$Button2.BackColor               = "#136aa4"
$Button2.ForeColor               = "#ffffff"
$Button2.text                    = "Delete"
$Button2.width                   = 90
$Button2.height                  = 32
$Button2.UseCompatibleTextRendering = $True
$Button2.UseVisualStyleBackColor = $False
$Button2.AutoSize = $true
# $Button2.location                = New-Object System.Drawing.Point(1600,920)
$Button2.Font                    = 'Microsoft Sans Serif,10'
# $Button2.Visible                 = $false

$Panel = New-Object System.Windows.Forms.TableLayoutPanel
$panel.Dock = "Fill"
$panel.ColumnCount = 1
$panel.RowCount = 1
$panel.CellBorderStyle = "single"
$panel.ColumnStyles.Add((new-object System.Windows.Forms.ColumnStyle([System.Windows.Forms.SizeType]::Percent, 100)))
$panel.RowStyles.Add((new-object System.Windows.Forms.RowStyle([System.Windows.Forms.SizeType]::Percent, 100)))


$Groupbox1                       = New-Object system.Windows.Forms.Groupbox
$Groupbox1.text                  = "Job Handling"
$Groupbox1.Font                  = 'Microsoft Sans Serif,9'
$Groupbox1.AutoSize              = $true
$Groupbox1.ForeColor             = "#032d5d"
$Groupbox1.location              = New-Object System.Drawing.Point(8,13)
$Groupbox1.Padding               = New-Object -TypeName System.Windows.Forms.Padding -ArgumentList (0,5,5,0)
$Groupbox1.Dock                  = "fill"
$Groupbox1.UseCompatibleTextRendering = $True

$Groupbox2                       = New-Object system.Windows.Forms.Groupbox
$Groupbox2.text                  = "Job Information"
$Groupbox2.Font                  = 'Microsoft Sans Serif,9'
$Groupbox2.AutoSize              = $true
$Groupbox2.ForeColor             = "#032d5d"
$Groupbox2.Dock                  = "None"
$Groupbox2.UseCompatibleTextRendering = $True

$ComboBox1                        = New-Object system.Windows.Forms.ComboBox
$ComboBox1.BackColor              = "#e8f3ff"
$ComboBox1.width                  = 190
$ComboBox1.height                 = 20
$ComboBox1.location               = New-Object System.Drawing.Point(35,80)
$ComboBox1.Font                   = 'Microsoft Sans Serif,12'
$ComboBox1.AutoSize               = $true
$ImageList = @(Get-ChildItem -Directory "D:\Process")
foreach ($img in $ImageList) {
    $ComboBox1.Items.Add($img)
}
$ComboBox1.Add_Click({
    if($ComboBox1.SelectedItem){
        $Checkbox.Visible = $true
    }
})

$Checkboxes += New-Object System.Windows.Forms.CheckBox
$Checkboxes = @()
$y = 20
$files = Get-ChildItem "D:\Process\$img" -Filter *.txt, *.csv
$files
foreach ($file in $files)
{    

    $Checkbox = New-Object System.Windows.Forms.CheckBox
    $Checkbox.Text = $file
    $Checkbox.Location = New-Object System.Drawing.Size(10,$y) 
    $Checkbox.Size = New-Object System.Drawing.Size(330,20) 
    $y += 30
    $Groupbox2.Controls.Add($Checkbox) 
    $Checkboxes += $Checkbox
    $Checkbox.Visible = $false
}

$Form.controls.AddRange(@($Panel))
$Panel.controls.AddRange(@($Groupbox1))
$Groupbox1.Controls.AddRange(@($Groupbox2, $ComboBox1, $Label1, $Button3, $Button2))

[void]$Form.Show()

$g2w = $Form.Width - 90
$g2h = $Form.Height - 270
$g2h

$Groupbox2.location              = New-Object System.Drawing.Point(35,110)
$Groupbox2.size                  = New-Object System.Drawing.Size($g2w,$g2h)
$Groupbox2.AutoSize              = $true

$bt2_w = $g2w - 55
$bt2_h = $g2h + 130
$Button2.location                = New-Object System.Drawing.Point($bt2_w,$bt2_h)


$bt3_w = $g2w - 160
$Button3.location                = New-Object System.Drawing.Point($bt3_w,$bt2_h)

$Form.Visible = $false
[void]$Form.ShowDialog()

这应该正是你想要的。通过双击一个目录,您也可以浏览子目录

Add-Type -AssemblyName System.Windows.Forms

[System.Windows.Forms.Application]::EnableVisualStyles()

# Global variables

$GH = [hashtable]::Synchronized(@{})

$GH.FolderPath        = 'C:\Users\myUser\Desktop\csvfiles'
$GH.CurrentFolderPath = $GH.FolderPath
$GH.FileMask          = @('*.txt','*.csv')

# windows form

$form = New-Object System.Windows.Forms.Form 
$form.Visible = $false
[void]$form.SuspendLayout()
$form.Text = "File Selection"
$form.ClientSize = New-Object System.Drawing.Size(320,430) 
$form.StartPosition = 'CenterScreen'
$form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedSingle

# tab control

$CTRL_TabCtrl = New-Object System.Windows.Forms.TabControl
$CTRL_TabCtrl.Location = New-Object System.Drawing.Point(5,5)
$CTRL_TabCtrl.Size = New-Object System.Drawing.Size(310,420)
[void]$form.Controls.Add($CTRL_TabCtrl)

$CTRL_Tab1 = New-Object System.Windows.Forms.TabPage
$CTRL_Tab1.AutoSize = $true
$CTRL_Tab1.Text = 'Main'
$CTRL_Tab1.TabIndex = 1
[void]$CTRL_TabCtrl.Controls.Add($CTRL_Tab1)

# list folder

$CTRL_label10 = New-Object System.Windows.Forms.Label
$CTRL_label10.Location = New-Object System.Drawing.Point(10,10) 
$CTRL_label10.Size = New-Object System.Drawing.Size(260,20) 
$CTRL_label10.Name = 'Label10'
$CTRL_label10.Text = 'Please select a folder:'
[void]$CTRL_Tab1.Controls.Add($CTRL_label10) 

$CTRL_ListFolder = New-Object System.Windows.Forms.Listbox
$CTRL_ListFolder.Location = New-Object System.Drawing.Point(10,30)
$CTRL_ListFolder.Size = New-Object System.Drawing.Size(280,60) 
$CTRL_ListFolder.SelectionMode = [System.Windows.Forms.SelectionMode]::One
$CTRL_ListFolder.Items.AddRange( (Get-ChildItem -Path $GH.CurrentFolderPath -Directory).Name  )
$CTRL_ListFolder.Enabled = $true
$CTRL_ListFolder.Add_MouseDoubleClick( { 
    $listFolder_innerevent = $true
    if( $CTRL_ListFolder.SelectedItem -eq '..' ) {
        $GH.CurrentFolderPath = $GH.CurrentFolderPath.Substring( 0, $GH.CurrentFolderPath.LastIndexOf( '\' ) )
        [void]$CTRL_ListFolder.Items.Clear()
        if( $GH.CurrentFolderPath.Length -gt $GH.FolderPath.Length ) {
            [void]$CTRL_ListFolder.Items.Add( '..' )
        }
        $CTRL_ListFolder.Items.AddRange( (Get-ChildItem -Path $GH.CurrentFolderPath -Directory).Name  )

        [void]$CTRL_CheckListBox.Items.Clear()
        $files = (Get-ChildItem -Path ($GH.CurrentFolderPath + '\*') -Include $GH.FileMask -File ).Name
        if( $files ) {
            [void]$CTRL_CheckListBox.Items.AddRange( $files )
        }
     }
     else {
         if( (Get-ChildItem -Path ($GH.CurrentFolderPath + '\' + $CTRL_ListFolder.SelectedItem) -Directory).Name ) {
            $GH.CurrentFolderPath += '\' + $CTRL_ListFolder.SelectedItem
            [void]$CTRL_ListFolder.Items.Clear()
            [void]$CTRL_ListFolder.Items.Add( '..' )
            [void]$CTRL_ListFolder.Items.AddRange( (Get-ChildItem -Path $GH.CurrentFolderPath -Directory).Name )

            [void]$CTRL_CheckListBox.Items.Clear()
            $files = (Get-ChildItem -Path ($GH.CurrentFolderPath + '\*') -Include $GH.FileMask -File ).Name
            if( $files ) {
                [void]$CTRL_CheckListBox.Items.AddRange( $files )
            }
         }
     }
 } )
[void]$CTRL_Tab1.Controls.Add($CTRL_ListFolder) 

# list folder with check boxes for files

$CTRL_label12 = New-Object System.Windows.Forms.Label
$CTRL_label12.Location = New-Object System.Drawing.Point(10,100) 
$CTRL_label12.Size = New-Object System.Drawing.Size(260,20) 
$CTRL_label12.Name = 'Label12'
$CTRL_label12.Text = 'Files found:'
[void]$CTRL_Tab1.Controls.Add($CTRL_label12) 


$CTRL_CheckListBox = New-Object System.Windows.Forms.CheckedListbox
$CTRL_CheckListBox.Location = New-Object System.Drawing.Point(10,120)
$CTRL_CheckListBox.Size = New-Object System.Drawing.Size(280,230) 
$CTRL_CheckListBox.CheckOnClick = $true
$CTRL_CheckListBox.Enabled = $true
$files = (Get-ChildItem -Path ($GH.CurrentFolderPath + '\*') -Include $GH.FileMask -File ).Name
if( $files ) {
    [void]$CTRL_CheckListBox.Items.AddRange( $files )
}
[void]$CTRL_Tab1.Controls.Add($CTRL_CheckListBox) 

$CTRL_OKButton1 = New-Object System.Windows.Forms.Button
$CTRL_OKButton1.Location = New-Object System.Drawing.Point(70,365)
$CTRL_OKButton1.Size = New-Object System.Drawing.Size(75,23)
$CTRL_OKButton1.Text = 'OK'
$CTRL_OKButton1.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $CTRL_OKButton1
[void]$CTRL_Tab1.Controls.Add($CTRL_OKButton1)

$CTRL_CancelButton1 = New-Object System.Windows.Forms.Button
$CTRL_CancelButton1.Location = New-Object System.Drawing.Point(150,365)
$CTRL_CancelButton1.Size = New-Object System.Drawing.Size(75,23)
$CTRL_CancelButton1.Text = 'Cancel'
$CTRL_CancelButton1.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CTRL_CancelButton1
[void]$CTRL_Tab1.Controls.Add($CTRL_CancelButton1)

[void]$form.ResumeLayout()

$userInput = $form.ShowDialog()

if ($userInput -eq [System.Windows.Forms.DialogResult]::OK) {
    # User clicked OK Button
}

我不确定我是否完全理解。但是,如果您打算在满足某些条件时显示复选框,为什么不创建复选框,但将display属性保持为false呢。当满足条件时,可以将其切换为true。这种方法比在运行时设置复选框要简单得多。但问题是,我不知道应该创建多少复选框,因为文件总数有时会发生变化。您希望为找到的每个csv/txt文件都设置一个复选框吗?是的,我会@f6a4Hi@f6a4,谢谢您的回答。我试过了,这不是我需要的,我需要选择的文件夹应该在组合框中。我也试着双击文件夹,复选框没有出现。嗨@f6a4我上传了结果的图片和你的脚本在更新的部分。我在这里选中了这个,一切都很好。您可以从主文件夹开始上下浏览子目录,找到的文件将列在第二个列表框中。对于文件夹导航,列表框比下拉控件更舒适。我还添加了一个屏幕截图。您好@f6a4,但它对我仍然不起作用:我可以知道您使用的是哪个PS版本吗?