2016-08-06 28 views
0

のWindows 2012 R2、Hyper-Vの2012 R2、SCVMM、PowerShellの...PowerShellパイプラインで、後続のLF文字を削除する方法は?

...私が使用して仮想マシンのリストを生成しています:

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 failed」を出力するとき)には後続のLF(char 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" 
... 

と末尾の改行文字の証拠を示すために、私は、AAには、Get-vms.csvをコピーしてBBし、その後、メモ帳を使用しました|つまり直前に、句「選択」私はこの表現を使用しようとした

B:\>fc /b a.a b.b 
Comparing files a.a and B.B 
00012DE7: 0A 22 
00012DE8: 22 2C 
00012DEA: 2C 22 
... 

:その後、BB編集し、隠された目に見えない文字を削除し、保存された、として示しており、バイナリファイルを比較しましたExport-CSV:

01ちょうどの代わりに
@{e={[string]::Replace($_.ComputerName,[char]0x0A,"l")}} 

...:

ComputerName 

...しかし、スクリプトは正常にすべてのVMのコンピュータ名を報告しなかった、つまり私が悪いの文字を取り除くために私の試みを使用し、 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" 
... 

... ie 2番目のフィールドのComputerNameアイテムが現在何も/ nullを効果的に報告していないことに注意してください。

言うまでもなく、私は頭を傷つけています...どのようにして不要なLF文字を取り除いても、ComputerNameテキストを表示できますか?

+0

' [文字列] ::交換してください(。$ _コンピュータ名、[文字]は0x0A、 "L") ':このような何か l ")' – PetSerAl

+0

これは 'Get-SCVirtualMachine'のバグのようです。そのようなstdoutにエラーメッセージを出力すべきではありません。 Microsoft Connect、またはSCVMMチームが使用するバグ報告システムに報告することができます。 –

+0

こんにちはPetSerAl - 返事をいただきありがとうございます。残念ながら、エラーを生成します。ヌル値の式でメソッドを呼び出すことはできません。 – sdo

答えて

0

.NET固有のコードではなく、プレーヤ用のPowershellもこれに使用できます。 改行文字は、PSでは `` n ''で表されます。だから、単純にこのようにそれを削除するには、空の文字列に置き換えることができます。

ComputerName -replace "`n","" 

あなたの選択で、それはこのようなものでなければならないこと置く場合:

Select Name, @{ Name = "ComputerName"; Expression = {$_.ComputerName -replace "`n","" }}, ... 

回避策が使用することですa forループ(%{...})をパイプに挿入し、必要なプロパティを含むカスタムPSオブジェクトを作成し、名前からLFをフィルタリングし、エクスポートするために使用します。それは速いかもしれませんが、わかりません。 。 - > `$ _ ComputerName.Replace([文字]は0x0A、」

<get,sort objects etc> 
| % { [PSCustomObject] @{ "ComputerName" = $_.ComputerName -replace "`n","" ; "Status" = $_.Status } } 
| <export to csv> 
+0

ジャック、返信いただきありがとうございますが、CSVファイルに空の/ nullのComputerNameフィールドがありますが、これはPowerShellの処理速度が非常に遅くなっているようです。 "Select"句でComputerNameだけを使用すると、スクリプトは500 VMをリストアップするのに約8秒かかりますが、この "-replace"を使うとスクリプトは150秒以上かかります。 – sdo

+0

CSVエクスポートをドロップしてコンソールに出力させるだけで、そこにもヌル文字が得られますか?そうであれば、まだselect文に何か問題があります。 Btw、私はあなたが必要と思うだけでなく、そこに1選択2.選択のステートメントで何が間違っているかを最初に考えてみてください。それがうまくいくとソートとCSVエクスポートをもう一度追加できます。 – n3wjack

+0

ありがとうジャック。 2番目のセレクトを取り除くと、同じことが起こります。 2番目のSelectを続けてFormat-Tableを介して出力すると、LFは表示されませんが、列が切り捨てられ、問題フィールドに「getaddrinfo fail ...」と表示されるので、この切り詰めが隠れている可能性があります/後続のLFをチョッピングする。 Format-Tableでこの列の出力を拡大できるかどうかを確認します。 – sdo

関連する問題