PowerShell 中的查找和替换生成 corrupt/not 个有效文件

Find and Replace in PowerShell produces a corrupt/not valid file

我正在使用 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 来使用 Import-VM 时:

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

我收到错误:

"Import-VM : The virtual machine configuration could not be read. The data might be corrupt or not valid."

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

你能试试这个吗? 您可能遇到换行符等问题

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/

我遇到了完全相同的问题,我就是这样解决的:

问题

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

解决方案

原来解决方法是,Out-File默认以Unicode格式写入。我需要将编码格式更改为 ASCII,以使其成为 Receiver 要求的格式。