Powershell:将对象[]输出到文件

时间:2009-10-27 19:28:56

标签: powershell enumeration

我想检索文件的内容,过滤并修改它们并将结果写回文件。我这样做:

PS C:\code> "test1" >> test.txt
PS C:\code> "test2" >> test.txt
PS C:\code> $testContents = Get-Content test.txt
PS C:\code> $newTestContents = $testContents | Select-Object {"abc -" + $_}
PS C:\code> $newTestContents >> output.txt

output.txt包含

"abc -" + $_                                                                                                           
------------                                                                                                           
abc -test1                                                                                                             
abc -test2             

第一行给出了什么?它几乎就像foreach给出一个IEnumerable - 但$ newTestContents.GetType()显示它是一个对象数组。什么给出了什么?如何在没有奇怪标题的情况下正常输出数组。

如果你能告诉我为什么$ newTestContents [0] .ToString()是一个空白字符串

也是奖励积分

2 个答案:

答案 0 :(得分:3)

  
    

如果你能告诉我为什么$ newTestContents [0] .ToString()是一个空白字符串

也是奖励积分   

如果你看它的类型,那就是PSCustomObject,例如

PS> $newTestContents[0].GetType().FullName
System.Management.Automation.PSCustomObject

如果你在Reflector中查看PSCustomObject的ToString()impl,你会看到:

public override string ToString()
{
    return "";
}

为什么会这样,我不知道。但是,在PowerShell中使用字符串类型强制可能更好,例如:

PS> [string]$newTestContents[0]
@{"abc -" + $_=abc -test1}

也许你正在寻找这个结果:

PS> $newTestContents | %{$_.{"abc -" + $_}}
abc -test1
abc -test2

这表明当您使用带有简单scriptblock的Select-Object时,该scriptblock的内容将在创建的PSCustomObject上形成新的属性名称。一般来说,Nestor的方法是可行的,但是将来如果你需要合成这样的属性,那么使用像这样的哈希表:

PS> $newTestContents = $testContents | Select @{n='MyName';e={"abc -" + $_}}
PS> $newTestContents

MyName
------
abc -test1
abc -test2


PS> $newTestContents[0].MyName
abc -test1

答案 1 :(得分:2)

使用ForEach而不是Select-Object