Windows 2012 R2,Hyper-V 2012 R2,SCVMM,PowerShell ......
...我使用以下方式生成虚拟机列表:
Get-SCVirtualMachine -All `
| Select-Object Name, ComputerName, Status, Memory, CPUCount, Location, VMHost `
| Sort-Object Name, ComputerName `
| Select Name, ComputerName, Status, @{e={[math]::Round($_.Memory/1024)}}, CPUCount, Location, VMHost `
| Export-CSV -Path "get-vms.csv" -NoTypeInformation
...但是对于其中一个VM,ComputerName文本(当它打印" getaddrinfo失败")包含一个尾随LF(字符0x10),我无法弄清楚如何剥离它关闭。
导出的CSV文件中的问题条目如下所示:
B:\> type get-vms.csv
...
"client02","client02.blah.com","Running","12","4","C:\Storage\CSV02\client02","host02.blah.com"
"client03","getaddrinfo failed
","Running","2","1","C:\Storage\CSV03\client03","host03.blah.com"
...
为了显示尾随LineFeed字符的证据,我将get-vms.csv复制到aa和bb,然后使用记事本编辑bb并删除隐藏的不可见字符,并保存,然后执行二进制文件比较,显示:
B:\>fc /b a.a b.b
Comparing files a.a and B.B
00012DE7: 0A 22
00012DE8: 22 2C
00012DEA: 2C 22
...
我试图在" |中使用此表达式选择"子句,即在Export-CSV之前:
@{e={[string]::Replace($_.ComputerName,[char]0x0A,"l")}}
......代替:
ComputerName
...但是脚本无法正确报告所有虚拟机的ComputerName,即当我尝试剥离坏角色时,我的CSV文件看起来像:
B:\> type get-vms.csv
...
"client02",,"Running","12","4","C:\Storage\CSV02\client02","host02.blah.com"
"client03",,"Running","2","1","C:\Storage\CSV03\client03","host03.blah.com"
...
...即。注意第二个字段的ComputerName项现在如何有效地报告/ null。
毋庸置疑,我正在挠头......如何删除不需要的LF字符但仍然显示ComputerName文本?
答案 0 :(得分:0)
您也可以使用纯Powershell,而不是.NET特定代码。 换行符由PS中的“n”表示。因此,您只需将其替换为空字符串即可将其删除,如下所示:
ComputerName -replace "`n",""
如果你把它放在你的选择中它应该是这样的:
Select Name, @{ Name = "ComputerName"; Expression = {$_.ComputerName -replace "`n","" }}, ...
解决方法是在管道中使用for循环(%{...})并创建包含所需属性的自定义PS对象,过滤名称中的LF并使用它导出。那可能会更快,但我不确定。 像这样:
<get,sort objects etc>
| % { [PSCustomObject] @{ "ComputerName" = $_.ComputerName -replace "`n","" ; "Status" = $_.Status } }
| <export to csv>