Powershell错误:方法调用...不包含名为'replace'的方法

时间:2015-07-10 08:08:11

标签: xml powershell search replace

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

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

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

  

uehjduehduhfeuf xxxxxxxx hallo“1234”

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

  

方法调用失败,因为[System.Object []]不包含   名为'replace'的方法。

有人知道这是什么问题吗?

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

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指出的那样。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

感谢@Enrico Campidoglio的解释!

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

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

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