【问题标题】:Powershell. How to change a key for a web.config xml file for all folders in directory?电源外壳。如何更改目录中所有文件夹的 web.config xml 文件的密钥?
【发布时间】:2021-04-13 19:37:27
【问题描述】:

如何更改 C:\Script 中的所有 web.config 文件?不仅仅是其中一个,而是目录中的所有。谢谢!

   $webConfig = 'C:\Script\web.config'
    $doc = (gc $webConfig) -as [xml]
    $doc.SelectSingleNode('//appSettings/add[@key="EMAIL_FROM"]/@value').'#text' = 'email@gmailcom'
    $doc.Save($webConfig)

【问题讨论】:

  • 您可以使用Get-ChildItem 来获取所有*.config 文件,然后您只需要一个foreach 循环。
  • 你能给我一个这个问题的例子吗?
  • 有其他人愿意帮忙吗?非常感谢
  • 您所需要的只是在 PS 帮助文件中,Santiago Squarzon 响应是正确的并查看示例,会给您答案。这是很常见的事情。你搜索了什么? 'Powershell parse xml' XML/JSON 是 PowerShell 的核心。该用例有特定的内置 cmdlet。其次,XML 只是文本,与常规文本一样,您可以使用 Select-String cmdlet 和 -Replece 来全局修改文件。这是一个常见的问题,在整个网络、Youtube 和 SO 上都有大量示例。
  • 仅供参考;从任何地方获取代码时,请遵循以下规则:1。如果你不明白它在做什么,或者愿意完全接受结果,就永远不要运行任何人的代码。无论在哪里或谁;除非您愿意接受运行它的所有后果。 2. 绝不会在未完全检查结果之前运行破坏性代码(新/添加/创建/更新、移动/删除/删除/更新/修改等)。掌握WhatIf/Confirm/Trace-Command/Invoke-ScriptAnalyzer的使用。 3。所有输入都是邪恶的,无论它来自哪里,直到您首先验证它,然后再使用它。

标签: xml powershell directory web-config appsettings


【解决方案1】:

继续我的评论。以下所有信息均来自帮助信息。

在 PowerShell 中为您的用例使用 .Net 命名空间更常见的是这样......

[xml]$webConfig = Get-Content -Path 'C:\Script\web.config'

...但是,嘿,选择,对。最好只使用 XML 的内置 PowerShell cmdlet。

Get-Command -Name '*xml*' 
# Results
<#
CommandType Name          Version Source                      
----------- ----          ------- ------                      
Cmdlet      ConvertTo-Xml 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet      Export-Clixml 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet      Import-Clixml 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet      Select-Xml    3.1.0.0 Microsoft.PowerShell.Utility
#>

# Get specifics for a module, cmdlet, or function
(Get-Command -Name Select-Xml).Parameters
(Get-Command -Name Select-Xml).Parameters.Keys
Get-help -Name Select-Xml -Examples
# Results
<#
 $Path = "$Pshome\Types.ps1xml"
 $XPath = "/Types/Type/Members/AliasProperty"
 Select-Xml -Path $Path -XPath $Xpath | Select-Object -ExpandProperty Node
 [xml]$Types = Get-Content $Pshome\Types.ps1xml
 Select-Xml -Xml $Types -XPath "//MethodName"
 $Namespace = @{command = "http://schemas.microsoft.com/maml/dev/command/2004/10"; maml = "http://schemas.microsoft.com/maml/2004/10"; dev = 
 $Path = "$Pshome\en-us\*dll-Help.xml"
 $Xml = Select-Xml -Path $Path -Namespace $Namespace -XPath "//command:name"
 $Xml | Format-Table @{Label="Name"; Expression= {($_.node.innerxml).trim()}}, Path -AutoSize
 $Xml = @"
 Select-Xml -Content $Xml -XPath "//edition" | foreach {$_.node.InnerXML}
 $Xml | Select-Xml -XPath "//edition" | foreach {$_.node.InnerXML}
 $SnippetNamespace = @{snip = "http://schemas.microsoft.com/PowerShell/Snippets"}
 Select-Xml -Path $Home\Documents\WindowsPowerShell\Snippets -Namespace $SnippetNamespace -XPath "//snip:Title" | foreach {$_.Node.Innerxml}
#>
Get-Help -Name Select-Xml -Detailed
Get-help -Name Select-Xml -Full
Get-help -Name Select-Xml -Online

虽然也可以使用 Select-String。

# Get specifics for a module, cmdlet, or function
(Get-Command -Name Select-String).Parameters
(Get-Command -Name Select-String).Parameters.Keys
Get-help -Name Select-String -Examples
Get-Help -Name Select-String -Detailed
Get-help -Name Select-String -Full
Get-help -Name Select-String -Online

这是一个关于我提供已接受答案的类似用例的 SO Q&A。

https://stackoverflow.com/questions/67008189/powershell-find-and-update-all-instances-of-named-object-property-recursively/67009139#67009139

虽然 OP 的用例是 JSON 文件,但同样的方法可用于 XML,但使用 PowerShell XML cmdlet 更为谨慎。

 Select-Xml -xpath '//data/value[contains(.,"the the")]' | 
ForEach-Object{$_.Node.'#text'}

同样,网络上有很多这样的例子:

PowerShell 'recursive replace select-xml'

至于这个……

“C:\Script 中的所有 web.config 文件?不只是其中一个”

...获取文件夹路径/树中的所有文件,这就是...

获取子项

... cmdlet 用于,以及通过循环使用迭代。对于任何 1:Many 的事情来说,这是一个常见/必要的日常。

PowerShell 'for loop'

@Santiago Squarzon 告诉你的是什么。

所以,只需将您的代码帖子修改为这个。

Get-ChildItem -Path 'RootPathToConfigFiles' | 
ForEach-Object {
    $webConfig = $PSItem.FullName
    $doc = (Get-Content -Path $webConfig) -as [xml]
    $doc.SelectSingleNode('//appSettings/add[@key="EMAIL_FROM"]/@value').'#text' = 'email@gmailcom'
    $doc.Save($webConfig)
}

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多