Powershell。如何更改目录中所有文件夹的web.config xml文件的密钥?

Powershell。如何更改目录中所有文件夹的web.config xml文件的密钥?,xml,powershell,directory,web-config,appsettings,Xml,Powershell,Directory,Web Config,Appsettings,如何对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.S

如何对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)

继续我的评论。以下所有信息都是从帮助信息中获得的

在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
这里是一个关于类似用例的SO问答,我为其提供了公认的答案

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'}
同样,网络上有很多这样的例子:

至于这个

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

…获取文件夹路径/目录树中的所有文件时

获取子项

。。。cmdlet用于,同时通过循环使用迭代。对于任何1:多的事情,每天都要做这件事

这就是
@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)
}

您可以使用
Get ChildItem
获取所有的*.config文件,然后您只需要一个
foreach
循环。您能给我一个这个问题的例子吗?其他人能帮上忙吗?非常感谢您所需要的一切都在PS帮助文件中,
Santiago Squarzon
回答是正确的,请查看示例,并给出答案。这是一件很平常的事。你在找什么?XML/JSON是PowerShell的核心。该用例有特定的内置cmdlet。其次,XML只是文本,就像普通文本一样,您可以使用Select-String cmdlet和-Replece来全局修改文件。这是一个常见的问题,网上、Youtube上以及这里都有大量的例子;从任何地方获取代码时,请遵循以下规则:
1
。如果您不了解任何人的代码在做什么,或者不愿意完全接受其结果,则永远不要运行任何人的代码。无论在哪里或谁;除非你愿意承担运行它的所有后果<代码>2。在运行破坏性代码(新建/添加/创建/更新、移动/删除/删除/更新/修改等)之前,请务必完全检查结果。掌握WhatIf/Confirm/Trace命令/Invoke-ScriptAnalyzer的使用<代码>3。所有的输入都是邪恶的,不管它来自哪里,直到您在使用它之前首先验证它。
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)
}