2

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

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() 是一个空白字符串,还有加分

4

2 回答 2

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

这表明当您将 Select-Object 与简单的脚本块一起使用时,该脚本块的内容会形成所创建的 PSCustomObject 上的新属性名称。一般来说,Nestor 的方法是要走的路,但将来如果你需要合成这样的属性,那么使用这样的哈希表:

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

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


PS> $newTestContents[0].MyName
abc -test1
于 2009-10-28T20:51:30.257 回答
2

使用 ForEach 而不是 Select-Object

于 2009-10-27T19:36:50.097 回答