继续我的评论。以下所有信息均来自帮助信息。
在 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)
}