Powershell-用于checkedlistbox列表的XML源代码分离和自定义描述性预览
我编写了一个脚本,它读取一个配置组XML文件,为名称和描述值创建一个数组,并用名称填充checkedlistbox。选择项目后,描述文本框将相应地从散列更新。这是可行的,但并不理想 当我试图通过两种方式来增强表单时,我的表现很糟糕: 1将XML文件拆分为多个文件,但保留了一个文件包含多个配置的能力,因此可以单独和单独管理这些配置 2增强“描述”文本框,使其现在包含相应XML节点的完整内容,该节点以NodeName=Value的无节INI样式显示。如果一个节点包含多个值,我希望这些值用逗号分隔 我正在进入下一阶段,您可以在更换时看到: a使用主脚本正文中的ReadConfigurationGroupsFile调用ReadCfgGroupsFile,并 b使用中的ftnUpdateConfigurationGroupDescription调用ftnUpdateCfgGroupDescription clb\u CC\u CfgGroups.Add\u selectedIndex已更改 …但我仍停留在ReadConfigurationGroups文件上,并怀疑当ftnUpdateConfigurationGroupDescription与ReadConfigurationGroups文件的解析一起使用时,我将使用ftnUpdateConfigurationGroupDescription 有人能帮忙吗 非常感谢, 肖恩 以下是脚本:Powershell-用于checkedlistbox列表的XML源代码分离和自定义描述性预览,xml,powershell,match,filenames,checkedlistbox,Xml,Powershell,Match,Filenames,Checkedlistbox,我编写了一个脚本,它读取一个配置组XML文件,为名称和描述值创建一个数组,并用名称填充checkedlistbox。选择项目后,描述文本框将相应地从散列更新。这是可行的,但并不理想 当我试图通过两种方式来增强表单时,我的表现很糟糕: 1将XML文件拆分为多个文件,但保留了一个文件包含多个配置的能力,因此可以单独和单独管理这些配置 2增强“描述”文本框,使其现在包含相应XML节点的完整内容,该节点以NodeName=Value的无节INI样式显示。如果一个节点包含多个值,我希望这些值用逗号分隔 我
function ReadCfgGroupsFile ()
{
[array] $script:CfgGroupNames = $null
[array] $script:CfgGroupDescriptions = $null
#[System.Windows.Forms.MessageBox]::Show("CfgGroupsFilePath=" + $CfgGroupsFilePath, $ScriptTitle)
$FileExists = Test-Path $CfgGroupsFilePath
if ($FileExists -eq $true) {
$script:xmlCfgGroups.Load($CfgGroupsFilePath)
$xml_CfgGroups = $script:xmlCfgGroups.SelectNodes("/ConfigurationGroup/Group")
ForEach ($CfgGroup in $xml_CfgGroups) {
[array] $script:CfgGroupNames += $CfgGroup.Name
[array] $script:CfgGroupDescriptions += $CfgGroup.Description
}
}
}
function BuildForm
# Build the main graphical user interface form
{
# Declare objects
$frm_BuildConfigurator = New-Object System.Windows.Forms.Form
$btn_Cancel = New-Object System.Windows.Forms.Button
$gb_CC_CfgGroups = New-Object Windows.Forms.GroupBox
$clb_CC_CfgGroups = New-Object System.Windows.Forms.CheckedListBox
$gb_CCF_Description = New-Object Windows.Forms.GroupBox
$tb_CCF_Description = New-Object System.Windows.Forms.TextBox
#Build the form
$frm_BuildConfigurator.Text = "Build Configurator"
$frm_BuildConfigurator.StartPosition = "CenterScreen"
$frm_BuildConfigurator.Width = 380
$frm_BuildConfigurator.Height = 360
$frm_BuildConfigurator.FormBorderStyle = "FixedSingle"
$frm_BuildConfigurator.ControlBox = $false
$frm_BuildConfigurator.Controls.Add($btn_Cancel)
#Set default button behaviour
$frm_BuildConfigurator.KeyPreview = $True
$frm_BuildConfigurator.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$frm_BuildConfigurator.Close()}})
$frm_BuildConfigurator.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$frm_BuildConfigurator.Close()}})
# Create the Cancel button
$btn_Cancel.Location = New-Object System.Drawing.Size(50,305)
$btn_Cancel.Size = New-Object System.Drawing.Size(55,23)
$btn_Cancel.Text = "Cancel"
$btn_Cancel.Add_Click({$frm_BuildConfigurator.Close()})
# Create the CfgGroups form elements
$frm_BuildConfigurator.Controls.Add($gb_CC_CfgGroups)
$frm_BuildConfigurator.Controls.Add($gb_CCF_Description)
# Create the CfgGroups group box
$gb_CC_CfgGroups.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation
$gb_CC_CfgGroups.Location = New-Object System.Drawing.Point(10,6)
$gb_CC_CfgGroups.Name = "gb_CC_CfgGroups"
$gb_CC_CfgGroups.Size = New-Object System.Drawing.Size(350,132)
$gb_CC_CfgGroups.Text = "Configuration Groups"
$gb_CC_CfgGroups.Controls.Add($clb_CC_CfgGroups)
$clb_CC_CfgGroups.Location = New-Object Drawing.Point 11,16
$clb_CC_CfgGroups.Size = New-Object System.Drawing.Size(220,110)
$clb_CC_CfgGroups.Add_SelectedIndexChanged({ftnUpdateCfgGroupDescription})
#$clb_CC_CfgGroups.Add_SelectedIndexChanged({ftnUpdateConfigurationGroupDescription})
ForEach ($Item in $script:CfgGroupNames) { $clb_CC_CfgGroups.Items.Add($Item) | Out-Null }
# Create the Description group box
$gb_CCF_Description.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation
$gb_CCF_Description.Location = New-Object System.Drawing.Point(10,146)
$gb_CCF_Description.Name = "gb_CCF_Description"
$gb_CCF_Description.Size = New-Object System.Drawing.Size(350,145)
$gb_CCF_Description.Text = "Description"
$gb_CCF_Description.Controls.Add($tb_CCF_Description)
$tb_CCF_Description.Location = New-Object System.Drawing.Size(11,17)
$tb_CCF_Description.Size = New-Object System.Drawing.Size(330,120)
$tb_CCF_Description.TabIndex = 7
$tb_CCF_Description.Text = ""
$tb_CCF_Description.Multiline = $true
#Show the Form
$frm_BuildConfigurator.ShowDialog() | Out-Null
}
function ftnUpdateCfgGroupDescription()
{
$tb_CCF_Description.Text = $script:CfgGroupDescriptions[$clb_CC_CfgGroups.SelectedIndex]
}
function ReadConfigurationGroupsFiles ()
{
[array] $script:ConfigurationGroupsFiles = $null
$xml_ConfigurationGroups = $null
$filter = 'CfGrp_'
Get-ChildItem -Path $scriptDir | Where-Object { $_.FullName -match $filter } | ForEach-Object {
[xml]$xml = Get-Content $_.FullName;
$innerel += $xml.selectnodes("/*/*")
[System.Windows.Forms.MessageBox]::Show("_.FullName=" + $_.FullName, $ScriptTitle)
}
foreach ($inone in $innerel) {
$inone = $xmldoc.importnode($inone, $true)
$rootnode.appendchild($inone)
}
}
function ftnUpdateConfigurationGroupDescription ()
{
$tb_CCF_Description.Text = { $script:xmlConfigurationGroups.ConfigurationGroup.Group.($clb_CC_Cfg_Groups.SelectedItem) | ForEach $_ '[0]=[1]`n' }
}
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$script:xmlCfgGroups = $null; $script:xmlCfgGroups = New-Object -TypeName XML
$script:xmlConfigurationGroups = $null; $script:xmlConfigurationGroups = New-Object System.Xml.XmlDocument
$ScriptPath = $MyInvocation.MyCommand.Path
$ScriptDir = Split-Path -parent $ScriptPath
$CfgGroupsFilePath = $ScriptDir + "\CfgGroups.xml"
$BuildScriptStr = $MyInvocation.MyCommand.Definition #Full path - for script name only use $MyInvocation.MyCommand.Name
ReadCfgGroupsFile
#ReadConfigurationGroupsFiles
BuildForm
以下是初始的组合XML数据文件CfgGroups.XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConfigurationGroup>
<Group Name="Group1">
<Description>Group1 information.</Description>
<Features>BITS</Features>
<IPAddress>10.9.193</IPAddress>
<SubnetMask>255.255.255.0</SubnetMask>
<Gateway>10.9.101.1</Gateway>
<DNS1>10.9.193.11</DNS1>
<DNS2>10.9.193.12</DNS2>
</Group>
<Group Name="Group2">
<Description>Group2 information.</Description>
<Features>Net-Framework-Core,RDS-RD-Server,</Features>
<IPAddress>10.251.120</IPAddress>
<SubnetMask>255.255.255.0</SubnetMask>
<Gateway>10.251.96.1</Gateway>
<DNS1>10.251.120.11</DNS1>
<DNS2>10.251.120.12</DNS2>
</Group>
</ConfigurationGroup>
下面是两个拆分实例,我想继续使用
CfGrp_Group1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConfigurationGroup>
<Group Name="Group1a">
<Description>Group1a information.</Description>
<Features>BITS</Features>
<IPAddress>10.9.193</IPAddress>
<SubnetMask>255.255.255.0</SubnetMask>
<Gateway>10.9.101.1</Gateway>
<DNS1>10.9.193.11</DNS1>
<DNS2>10.9.193.12</DNS2>
</Group>
<Group Name="Group1b">
<Description>Group1b information.</Description>
<Features>Net-Framework-Core,RDS-RD-Server,</Features>
<IPAddress>10.251.120</IPAddress>
<SubnetMask>255.255.255.0</SubnetMask>
<Gateway>10.251.96.1</Gateway>
<DNS1>10.251.120.11</DNS1>
<DNS2>10.251.120.12</DNS2>
</Group>
</ConfigurationGroup>
和CfGrp_Group2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConfigurationGroup>
<Group Name="Group2">
<Description>Group2 information.</Description>
<Features>Net-Framework-Core,RDS-RD-Server,GPMC,Web-Server,Web-Asp-Net,Web-Net-Ext,Web-Mgmt-Console,RSAT-AD-PowerShell</Features>
<IPAddress>10.10.254</IPAddress>
<SubnetMask>255.255.255.0</SubnetMask>
<Gateway>10.10.1.254</Gateway>
<DNS1>10.10.1.2</DNS1>
<DNS2>10.10.1.3</DNS2>
</Group>
</ConfigurationGroup>