【问题标题】:Powershell string search with wildcard and backslashes使用通配符和反斜杠进行 Powershell 字符串搜索
【发布时间】:2014-07-22 17:15:49
【问题描述】:

在一个文件中,我需要多次搜索以下字符串:

e:\\installroot\\Development2_14.07.21.000\\

字符串的第一部分应始终保持不变:"e:\\installroot\\"

但是字符串的第二部分会改变(永远不会一样),我还需要搜索这个字符串并用新值替换它:"Development2_14.07.21.000"

这是我尝试更新的文件(reg 文件)的示例:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\CompanyName\Services]
"Proc"="w:\\installroot\\Development2_14.07.21.000\\debug\\job.dll,JobServiceThread,interval;30;w:\\installroot\\Development2_14.07.21.000\\debug\\proc.exe deltasets=TEMP"
"Order"="W:\\installroot\\Development2_14.07.18.000\\debug\\order.dll,OrderThread,"
"GBatch"="NULL,ServiceThread,daily;01:10;W:\\installroot\\Development2_14.07.18.000\\debug\\file.exe"

我不确定通配符或正则表达式搜索/替换是否在这里最有效,因此可以在此处使用一些输入来确定最佳方法。注意双反斜杠。

另外,我宁愿直接更新注册表,而不是更新 reg 文件并进行 reg 导入,因此希望可以在 PowerShell 中完成。

另外请注意:我不会总是在我的搜索场景中使用术语“Development2_”。有时它可能是“Development_”、“Test_”或“Release_”,或该路径中的任何内容。只是需要考虑的事情。

【问题讨论】:

    标签: powershell search wildcard


    【解决方案1】:

    在此处插入通用查找和替换脚本:

    (gc C:\temp.txt) | % { 
        if($_ -like "*installroot*") {
            $_ -replace 'installroot\\.+?\\',"installroot\Development_14.07.21.111\"
        }
        else {
            $_
        }
     }| set-content C:\Temp.txt
    

    是的,你是对的,直接使用 powershell 对注册表进行这些更改会更容易。你应该试试看,告诉我们进展如何……

    【讨论】:

    • 感谢您的意见。在我的场景中,我并不总是能够使用“开发”一词。有时它可能是“Development2”、“Test”或“Release”,或其他。只是需要考虑的事情。
    • 我稍微修改了 -replace 字符串以帮助满足我的标准并让您的解决方案发挥作用:$_ -replace 'installroot\\.+?\\',"installroot\\$buildnum\" 当然,这只是对 reg 文件执行 S/R。需要直接在注册表上试试。谢谢科尔!
    • 是的,正是我刚刚更新我的答案的方式,看,你走在我前面 :D,注册表不会有太大不同,一旦你弄清楚如何遍历它并获取/设置值跨度>
    【解决方案2】:

    为什么 Select-String 没有按您的要求运行?

    在:

    (cat .\temp.txt | Select-String -Pattern "installroot") | % { $_.ToString() | % { $_ -replace $_.Substring(17), "Some new content" } }

    输出:

    e:\\installroot\\Some new content\

    【讨论】:

    • 嗯...不太好用。我实际上正在执行搜索/替换的文件是一个 reg 文件,然后一旦完成,我会执行一个 reg import filename.reg 以使用更改更新注册表。理想情况下,我更愿意通过更新以下所有字符串值来直接更新注册表: [HKLM\SOFTWARE\CompanyName\Services]
    • 任何错误代码?您可以共享文件的更广泛部分或理想情况下是整个文件吗?不确定自从脚本在您最初给出的条件下工作后出了什么问题?
    • 这是我要更新的 reg 文件内容的示例:Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\CompanyName\Services] "Proc"="w:\\installroot\\Development2_14.07.21.000\\debug\\job.dll,JobServiceThread,interval;30;w:\\installroot\\Development2_14.07.21.000\\debug\\proc.exe deltasets=TEMP" "Order"="W:\\installroot\\Development2_14.07.18.000\\debug\\order.dll,OrderThread," "GBatch"="NULL,ServiceThread,daily;01:10;W:\\installroot\\Development2_14.07.18.000\\debug\\file.exe"
    • 这里是 PS 代码:(cat d:\temp\temp.reg | Select-String -Pattern "installroot") | % { $_.ToString() | % { $_ -replace $_.Substring(17), "BUILDNUM" } } | set-content d:\temp\temp.reg
    • 好的,这将挑战提升到了一个新的水平。我不确定我能否很快找到解决方案。同时,请尝试编辑您的原始问题,使其涵盖这些重要的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多