我想检索文件的内容,过滤并修改它们并将结果写回文件。我这样做:
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()是一个空白字符串
也是奖励积分答案 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