在powershell管道中如何删除尾随LF字符?

时间:2016-08-06 18:44:30

标签: powershell

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文本?

1 个答案:

答案 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>