【问题标题】:update property value in xml file by reading it from properties file通过从属性文件中读取来更新 xml 文件中的属性值
【发布时间】:2021-10-04 15:44:34
【问题描述】:

我有一个包含以下条目的属性文件:-

DBconn=xlvxdev.cumulus.com,1615;Initial Catalog=FPTR_XLVX;Security=true;
WebErrString=off
XLVXProvidername=Client.Data.OraclieClient

我有另一个 xml 文件,如下所示,@@ @@ 之间有上述属性名称。

<?xml version="1.0"?>
<ConfigValues>
   <Connstring>
     add name="connXLVX" connectionString="Data Source=@@DBconn@@" providerName="@@XLVXProvidername@@"/>
   </Connstring>
   <WebErrormode="@@WebErrString@@" />
</ConfigValues>

我能够从配置文件中更新给定的属性,如下所示,但无法遍历 @@ @@ 之间的所有属性并更新它们。

$proppath='C:\Desktop\dev.properties'
$webconfigpath= 'C:\Desktop\xml.config'
$AppProps = @{}
$AppProps = convertfrom-stringdata (get-content $proppath -raw)
(Get-Content $webconfigpath) -replace "@@DBconn@@", $AppProps["DBconn"] | Set-Content $webconfigpath

【问题讨论】:

  • 请允许我给你一个标准的建议给新手:如果你accept 一个答案,你将帮助未来的读者,向他们展示解决了你的问题的方法。要接受答案,请单击答案左侧大数字下方的大 ✓ 符号(您将获得 2 点声望)。如果您至少有 15 个声望点,您还可以投票给其他有用的答案(也可以选择接受的答案)。如果您的问题尚未解决,请提供反馈,或者,如果您自己找到了解决方案,请self-answer

标签: xml powershell properties


【解决方案1】:

您需要的是根据给定匹配的特定文本动态确定每个替换字符串的能力:

PowerShell (Core) 6.1+ 中,您可以使用以下方法:

(Get-Content -Raw $webconfigpath) -replace '@@(\w+)@@', {
  $AppProps[$_.Groups[1].Value]
} | Set-Content $webconfigpath

每个匹配项都作为 System.Text.RegularExpressions.Match 实例传递给脚本块 ({ ... }),可以通过 automatic $_ variable 访问它。


在早期版本中,包括在 Windows PowerShell 中,-replace 运算符尚不支持基于脚本块的替换,因此需要直接使用底层 .NET API:

[regex]::Replace((Get-Content -Raw $webconfigpath), '@@(\w+)@@', {
  param($m)
  $AppProps[$m.Groups[1].Value]
}) | Set-Content $webconfigpath

【讨论】:

  • 这太棒了,不知道可以使用脚本块。
  • 是的,@SantiagoSquarzon,它非常方便;不幸的是,它在 Windows PowerShell 中不可用。 is 在那里可用——虽然用处不大,因此很少见——是将脚本块传递给-split 的能力,其中输入字符串中的每个字符都传递给$_;例如:'foobar' -split { $_ -in 'o', 'a' }
  • 不知道,哈哈,我希望有一天 PS 核心将成为公司的标准。
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2020-08-18
  • 2021-08-08
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多