Powershell: вывод объекта [] в файл - PullRequest
2 голосов
/ 27 октября 2009

Я хотел бы получить содержимое файла, отфильтровать и изменить его и записать результат обратно в файл. Я делаю это:

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 ]

3 голосов
/ 28 октября 2009

Также бонусные баллы, если вы можете сказать, почему $ newTestContents [0] .ToString () является пустой строкой

Если вы посмотрите на его тип, то это PSCustomObject, например.

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

Если вы посмотрите на impl ToString () объекта PSCustomObject в Reflector, вы увидите следующее:

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

Почему это происходит, я не знаю. Однако, вероятно, лучше использовать приведение типа строки в PowerShell, например ::1013*

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
2 голосов
/ 27 октября 2009

Используйте ForEach вместо Select-Object

...