【发布时间】:2017-09-06 00:10:17
【问题描述】:
问题
我正在尝试编写一个复杂的查找和替换方法,目的是递归搜索所有配置文件的目录(由用户提供),并根据是否替换配置文件中的一组选定部分/键一系列复选框被选中。
预期结果/示例
在下面的场景中,我只想用一个新值替换数据库密码(因此其他值对于这个例子并不重要)。
# collect only the configs that contain the section/key names the application is designed to alter
$configs = GCI -Path "$somePath\*.config" -Recurse | Where-Object {
((Select-String -Pattern "DatabasePassword") -ceq $true) -OR
((Select-String -Pattern "SomeKey02") -ceq $true) -OR
((Select-String -Pattern "SomeKey03") -ceq $true)
}
# if the checkbox for Database Password is checked, get the text after its key
if (DBPassword.Checked) {
foreach ($configFile in $configFiles) {
GC $configFile | Foreach-Object {
if ($config -match "DatabasePassword") {
#I know this next part is sorta right, but I haven't been able to get it to work right
$tmpStr = $configfile | Out-String
$start = tmpStr.IndexOf("=") + 2
$end = $tmpStr.IndexOf('"', $start)
$length = $end - $start
$Pass2Replace = $tmpStr.Substring($start, $length)
}
}
}
}
# This Next Section is Contained Within a ForEach Loop
# I believe I am Close, but This Doesn't Quite Work
# Parse Through All Config Files and Replace Keys Based On the '.Checked' Status of Each Check Box
(GC $configFiles) | ForEach-Object {
if ($DBPassword.Checked) {
ForEach-Object { $_.Replace($Pass2Replace, $newPass.Text) }
if ($checkbox02.Checked) {
ForEach-Object { $_.Replace($Key2Replace02, $newStr02.Text) }
if ($checkBox03.Checked) {
ForEach-Object { $_.Replace($Key2Replace03, $newStr03.Text) }
}
# Save Changes
Set-Content $configFile
所以最终,我所期望的结果是用户会选中“更新密码”复选框,在 GUI 文本框中输入新密码,然后单击“更新”按钮。然后,应用程序将查找配置文件,查找键 DatabasePassword,修改存储的值并保存更改。以下是本段的简化版本:
之前:
DatabasePassword = "SomeEncryptedPassword"
之后:
DatabasePassword = "AlteredEncryptedPassword"
问题
主要问题:让 PowerShell 收集这些密钥的未知存储值并仅替换该值的最佳方法是什么?
子问题01:假设主要问题有答案,是否可以只收集一部分存储值并替换它?
示例:假设我有一个名为 ConnectionString 的键,其值为 ((someRandomValue=AWQagaWGAAE#!)(someSetOfStrings)) ;然而,我只想收集值的(someRandomValue=AWQagaWGAAE#!) 部分。我如何只收集这部分并替换它(请记住 someRandomValue 是未知的)?
【问题讨论】:
-
请在文本前后显示一些示例。正则表达式将大大简化这一点。但是需要具体的例子。
-
@Matt 我修改了帖子以包含一个更相关的示例以及我期望更改的内容
-
您的 .config 文件的结构是什么?平面文字? INI 风格? XML?
-
“所以我不认为 XML Parser 可以使用它。”你想错了。
-
我有个好消息,PowerShell 是 XML 解析器!
[xml]$MyConfig = GC $ConfigPath以 XML 格式读入文件。然后,您可以将其通过管道传输到Select-Xml以执行 XPath 搜索,或者如果已经知道各种键的路径,您可以执行$OldDBPass = $MyConfig.Settings.DB1.DatabasePassword和$MyConfig.Settings.DB1.DatabasePassword = $NewPass之类的操作,然后$MyConfig.Save()应用更新。
标签: powershell substring str-replace