【问题标题】:Powershell Error: Method invocation...doesn't contain a method named 'replace'Powershell 错误:方法调用...不包含名为“替换”的方法
【发布时间】:2015-09-28 21:33:59
【问题描述】:

我想使用 PowerShell 搜索和替换 xml 文件中的字符串。 我试过这个:

(gc d:\test.xml).replace('1234','xxxx')|sc d:\test.xml

这适用于我的 test.xml 文件。我的 test.xml 文件的内容是:

uehjduehduhfeuf xxxxxxxx 你好“1234”

但该文件仅用于测试。我想以这种方式从我的 tomcat 服务器中编辑 server.xml,如果我使用的是与上面提到的完全相同的命令,我会收到以下错误消息:

方法调用失败,因为 [System.Object[]] 不包含 名为“替换”的方法。

有人知道是什么问题吗?

【问题讨论】:

    标签: xml powershell search replace


    【解决方案1】:

    您还可以使用[System.IO.File]::ReadAllText($filename) 从文件中获取单个字符串,其中包含所有换行符和其他符号。

    [System.IO.File]::ReadAllText("d:\test.xml").replace('1234','xxxx')|sc d:\test.xml
    

    【讨论】:

    • 如果某个答案对您有帮助,请单击您要标记为“该”答案的答案左侧的“勾号”。请在所有已正确回答的问题中这样做。这对您和整个 Stack Overflow 社区都有帮助。
    • 您点击了“upvote”(投票数上方的箭头),“accept”(downvote 箭头下方的绿色勾线勾号)不同。两者可以一起使用。此外,我访问了您的个人资料,发现您所有的问题都没有一个可接受的答案,而两个没有任何答案,两个有您标记为“谢谢”的答案(除了这个)。所以你可能不知道这里的意思是什么。
    • 感谢您的提示。我检查并更改了它。
    【解决方案2】:

    当您将Get-Content cmdlet 的输出存储在变量中时,数据将存储为Object(即Object[])类型的数组,源文件中的每一行都有一个元素。这里是from the documentation

    当 Get-Content 读取文本文件并将内容存储在 变量,数据存储为数组,文件中的每一行 (由是否存在回车换行符确定) 表示数组中的单个项目。

    当您在表达式周围加上括号时,PowerShell 会创建 一个临时变量,在 Get-Content 的情况下,它最终是 Object[] 类型。

    为了替换源文件中的文本,您需要遍历数组并分别操作每一行:

    gc d:\test.xml | foreach { $_ -replace "1234", "xxxx" } | sc d:\test.xml
    

    或者您可以直接调用 .NET BCL,正如@Vesper 指出的那样。

    【讨论】:

      【解决方案3】:

      Get-Content 将为您提供一个字符串数组,尝试使用原始开关,如下所示:

      (gc d:\test.xml -raw).replace('1234','xxxx')|sc d:\test.xml
      

      【讨论】:

      【解决方案4】:

      感谢@Enrico Campidoglio 的解释!

      除了您的回答之外,还需要转义一些字符(例如我的 PIPE):

      (gc d:\test.xml -raw).replace('\|',',')|sc d:\test.xml
      

      我会将此添加为评论,但我还不能...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 2023-02-03
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        • 2018-11-27
        • 2013-07-03
        相关资源
        最近更新 更多