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

5
我希望使用PowerShell在XML文件中搜索和替换字符串。我尝试了以下方法:
(gc d:\test.xml).replace('1234','xxxx')|sc d:\test.xml

这对我的test.xml文件有效。我的test.xml文件的内容是:

uehjduehduhfeuf xxxxxxxx hallo "1234"

但那个文件只用于测试。我想以这种方式编辑我的tomcat服务器上的server.xml,如果我使用完全相同的命令,我会得到以下错误消息:

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

有人知道问题在哪里吗?

4个回答

7

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

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

如果某个答案对您有帮助,请单击左侧的“勾选”以将其标记为“最佳答案”。请在所有已正确回答的问题中执行此操作。这将有助于您和整个Stack Overflow社区。 - Vesper
你点击了一个“赞同”(在投票数上方的箭头),而“采纳”(在踩箭头下方的绿色勾线框)是不同的。两者可以一起使用。另外,我访问了你的个人资料,并发现你所有的问题都没有被采纳的答案,其中两个问题没有任何答案,另外两个问题有你标记为“谢谢”的答案(除了这个问题)。所以可能你对这里的含义并不清楚。 - Vesper
谢谢这些提示。我已经检查并更改了它。 - Tobi123

6
当您将Get-Content cmdlet的输出存储在变量中时,数据将以Object类型的数组(即Object[])存储,每行源文件对应一个数组元素。以下是文档中的说明:

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

当您在表达式周围加上括号时,PowerShell会创建临时变量,在Get-Content的情况下,该变量最终成为Object[]类型。
为了替换源文件中的文本,您需要遍历数组并单独处理每一行:
gc d:\test.xml | foreach { $_ -replace "1234", "xxxx" } | sc d:\test.xml

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


1
使用Get-Content命令将会给你一个字符串数组,尝试使用raw开关来这样做:
(gc d:\test.xml -raw).replace('1234','xxxx')|sc d:\test.xml

不幸的是,这导致了另一个错误: Get-Content: 找不到与参数名“raw”匹配的参数。 - Tobi123
我认为在 Powershell v3 中添加了原始标志。 - Dave Sexton
@DaveSexton 我在Get-Content中甚至在Powershell 5.0中都没有看到-raw可用。 - Vesper
它在微软文档中 - 请参见:https://technet.microsoft.com/zh-cn/library/hh847788(v=wps.620).aspx - Dave Sexton

1
感谢@Enrico Campidoglio的解释!
除了你的答案之外,一些字符(例如我的情况下的PIPE)需要被转义:
(gc d:\test.xml -raw).replace('\|',',')|sc d:\test.xml

我本想将这个作为评论添加,但我还不能...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接