首页 \ 问答 \ 使用动态方法替换PowerShell字典中的占位符(Replace placeholders in PowerShell dictionary using dynamic method)

使用动态方法替换PowerShell字典中的占位符(Replace placeholders in PowerShell dictionary using dynamic method)

引用在PowerShell字典中用实际值替换占位符我试图用dynamically实际元素值替换PowerShell字典中的占位符。 我从上面的帖子收到了一个合适的答案,但这并没有多大帮助,因为它是一个静态解决方案。 需求变化频繁,所以我无法在PowerShell脚本中硬编码。 我对PowerShell脚本做了一些更改并尝试运行。 但遇到一些错误。 以下是我的代码:

$xmldata = @"
<configuration>
    <environment id="Development">
    <type>Dev</type>
    <client>Arizona%%type%%</client>
    <dataSource>Local%%client%%</dataSource>
    <path>App_Data\%%type%%\%%client%%_%%dataSource%%</path>
    <targetmachines>
        <targetmachine>
        <name>Any</name>
        <remotedirectory>D:\Inetpub\Test</remotedirectory>
        </targetmachine>
    </targetmachines>
    </environment>
</configuration>
"@

[System.Xml.XmlDocument] $configxml = [xml]$xmldata
$environmentId = "Development"
$keyValuePairs = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]"
$configxml.SelectNodes("//configuration/environment[@id='$($environmentId)']//*[not(*)]") | `
    ForEach-Object {
                    if($_.ParentNode.ToString() -ne "targetmachine")
                    {

                        $keyValuePairs.Add($_.Name, $_.InnerText)
                    }
                }

Write-Output $keyValuePairs

Foreach ($key in $keyValuePairs.Keys)
{

    $strings = [regex]::Matches($keyValuePairs[$key], '%%([^/)]+?)%%') |ForEach-Object { $_.Groups[1].Value }
    $strings = $strings | sort -unique

    if ($strings.Count -gt 0)
    {
        $finalValue = $keyValuePairs[$key]
        $finalValue

        foreach ($placeholder in $strings)
        {
            write-host "one of the place holder is" -ForegroundColor Green
            $placeholder
            #replacing all of the placeholders (which exists between %%---%%) with actual values
            $finalValue = $finalValue.Replace("%%$placeholder%%",$keyValuePairs[$placeholder])
        }

        #Replace the original value with actual value
        $keyValuePairs[$key] = $finalValue 
    }
}

Write-Output $keyValuePairs

尝试覆盖字典值时出现跟随错误

Collection was modified; enumeration operation may not execute.
At line:33 char:10
+ Foreach ($key in $keyValuePairs.Keys)
+          ~~~~
    + CategoryInfo          : OperationStopped: (:) [], InvalidOperationExcept 
   ion
    + FullyQualifiedErrorId : System.InvalidOperationException

注意:基本上我试图用动态方法替换所有字典值中的占位符。 有人可以帮助我如何实现以下输出

Key                        Value
---                        -----
type                       Dev
client                     ArizonaDev
dataSource                 LocalArizonaDev
path                       App_Data\Dev\ArizonaDev_LocalArizonaDev

Referring to Replace placeholders with actual values in PowerShell dictionary Im trying to replace placeholders in PowerShell dictionary with actual element values dynamically. I have received an appropriate answer from the above post, But that doesn't help much since it was a static solution. The requirement changes frequently, So I cannot hardcode things in PowerShell script. I have made few changes to the PowerShell script and tried to run. But encountered some errors. Following is my code:

$xmldata = @"
<configuration>
    <environment id="Development">
    <type>Dev</type>
    <client>Arizona%%type%%</client>
    <dataSource>Local%%client%%</dataSource>
    <path>App_Data\%%type%%\%%client%%_%%dataSource%%</path>
    <targetmachines>
        <targetmachine>
        <name>Any</name>
        <remotedirectory>D:\Inetpub\Test</remotedirectory>
        </targetmachine>
    </targetmachines>
    </environment>
</configuration>
"@

[System.Xml.XmlDocument] $configxml = [xml]$xmldata
$environmentId = "Development"
$keyValuePairs = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]"
$configxml.SelectNodes("//configuration/environment[@id='$($environmentId)']//*[not(*)]") | `
    ForEach-Object {
                    if($_.ParentNode.ToString() -ne "targetmachine")
                    {

                        $keyValuePairs.Add($_.Name, $_.InnerText)
                    }
                }

Write-Output $keyValuePairs

Foreach ($key in $keyValuePairs.Keys)
{

    $strings = [regex]::Matches($keyValuePairs[$key], '%%([^/)]+?)%%') |ForEach-Object { $_.Groups[1].Value }
    $strings = $strings | sort -unique

    if ($strings.Count -gt 0)
    {
        $finalValue = $keyValuePairs[$key]
        $finalValue

        foreach ($placeholder in $strings)
        {
            write-host "one of the place holder is" -ForegroundColor Green
            $placeholder
            #replacing all of the placeholders (which exists between %%---%%) with actual values
            $finalValue = $finalValue.Replace("%%$placeholder%%",$keyValuePairs[$placeholder])
        }

        #Replace the original value with actual value
        $keyValuePairs[$key] = $finalValue 
    }
}

Write-Output $keyValuePairs

Getting following error while trying to override the dictionary value

Collection was modified; enumeration operation may not execute.
At line:33 char:10
+ Foreach ($key in $keyValuePairs.Keys)
+          ~~~~
    + CategoryInfo          : OperationStopped: (:) [], InvalidOperationExcept 
   ion
    + FullyQualifiedErrorId : System.InvalidOperationException

Note: Basically Im trying to replace the placeholders from all over the dictionary values using dynamic method. Can someone please help me how can achive the following output

Key                        Value
---                        -----
type                       Dev
client                     ArizonaDev
dataSource                 LocalArizonaDev
path                       App_Data\Dev\ArizonaDev_LocalArizonaDev

原文:https://stackoverflow.com/questions/42687374
更新时间:2022-01-14 10:01

最满意答案

在那些事件中你需要说:(例如,找到名为txtName的文本框)

var txtName = e.Row.FindControl("txtName") as TextBox;

(查看ASPX标记代码以查看输入元素名称的名称 - 如果没有,则给它一个)然后使用上面的代码在网格视图事件处理程序中读取元素。 (将其强制转换为写入输入控件类型 - 即TextBox,CheckBox等)

这在大多数网格视图事件中都有效。在列表视图中,您可以说:

var txtName = e.Item.FindControl("txtName") as TextBox;

在某些事件中,您将行作为“e”的一部分(例如,RowCreated,RowDataBound)。 在其他一些(比如RowUpdated)你有e.RowIndex,你可以用它来说

grid.Rows[e.RowIndex].FindControl<...

您甚至可以浏览所有行并在正在编辑的行中找到您的控件

foreach (GridViewRow row in gridList.Rows)
{
    if (row.RowState == DataControlRowState.Edit)
    {
        var txtName = row.FindControl("txtName") as TextBox;
    }
}

In those events you need to say: (e.g. to find text box named txtName)

var txtName = e.Row.FindControl("txtName") as TextBox;

(look at the ASPX markup code to see what's the name of your input element name - give it one if it doesn't have) then use the code above to read your element in your grid view event handler. (Cast it to the write input control type - i.e. TextBox, CheckBox, etc.)

This is valid in most of grid view events, Also in list view you can say:

var txtName = e.Item.FindControl("txtName") as TextBox;

In some events, you have the row as a part of "e" (e.g. RowCreated, RowDataBound). In some other (like RowUpdated) you have e.RowIndex, which you can use to say

grid.Rows[e.RowIndex].FindControl<...

you can even go through all your rows and find your controls, in rows that are being editted

foreach (GridViewRow row in gridList.Rows)
{
    if (row.RowState == DataControlRowState.Edit)
    {
        var txtName = row.FindControl("txtName") as TextBox;
    }
}

相关问答

更多

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)