我想使用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'的方法。
有人知道这是什么问题吗?
答案 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
我会将此添加为评论,但我还不能......