PowerShell中的查找和替换会生成损坏/无效的文件

时间:2015-07-14 09:57:57

标签: xml powershell hyper-v

我使用PowerShell编辑XML文件。我正在做的是搜索字符串并在XML中替换该字符串。对此的命令如下:

(Get-Content "C:\My_VM\Virtual Machines\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.XML") | 
Foreach-Object {$_ -replace "My_VMName", "My_VMName_0"} |
Set-Content "C:\My_VM\Virtual Machines\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.XML"

在我的情况下,XML文件是要导入Hyper-V的虚拟机映像

find / replace工作正常,我可以重命名.vhdx文件,导入也没问题。我是这样做的:

Rename-Item "C:\My_VM\Virtual Hard Disks\My_VMName.vhdx" My_VMName_0.vhdx

但是当我尝试使用以下cmdlet导入VM时:

Import-VM -Path "C:\My_VM\Virtual Machines\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.XML" -Copy -GenerateNewID

我收到错误:

" Import-VM:无法读取虚拟机配置。数据可能已损坏或无效。"

有谁知道这是为什么?我已经提出了一种解决方法(使用不同的技术),但它仍然令人沮丧。如果我打开一个文本编辑器并手动重命名它,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

你可以试试这个吗? 您可能对换行符等问题。

ForEach ($line in (Get-Content "C:\My_VM\Virtual Machines\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.XML")) {
  $line -replace "My_VMName", "My_VMName_0" | Out-File new.txt -Append
}

更多相关信息:http://powershell.org/wp/2013/10/21/why-get-content-aint-yer-friend/

答案 1 :(得分:1)

我遇到了同样的问题,这就是我如何解决它的问题:

<强>问题

当我尝试使用PowerShell编辑Citrix Receiver * .ica文件时。如果我用记事本打开文件,替换我想要的文本,然后保存它,Receiver将启动会话。但是,如果我使用Get-Content然后使用Out-File使用PowerShell,则该文件看起来很正常,但Receiver无法读取并报告一般错误。

<强>解决方案

解决方案证明,默认情况下,Out-File以Unicode格式写入。我需要将编码格式更改为ASCII,以使其具有Receiver所需的格式。