سؤال

وأود أن استرداد محتويات ملف وتصفية وتعديلها والكتابة النتيجة مرة أخرى إلى ملف. أفعل هذا:

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 () هي سلسلة فارغة

هل كانت مفيدة؟

المحلول

استخدم ForEach بدلا من الاختيار بين وجوه

نصائح أخرى

<اقتباس فقرة>   <اقتباس فقرة>     

وأيضا نقاط المكافأة إذا كان يمكنك أن تقول لي لماذا $ newTestContents [0] .ToString () هي سلسلة فارغة

  

إذا نظرتم نوعه، بل هو PSCustomObject منها مثلا.

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

إذا نظرتم ToString PSCustomObject () لimpl في العاكس ترى هذا:

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

وماذا يفعل هذا، وأنا لا أعرف. ومع ذلك، قد يكون من الأفضل استخدام سلسلة نوع الإكراه في بوويرشيل منها مثلا:

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

وربما كنت تبحث عن هذه النتيجة على الرغم من:

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

وهذا يدل على أنه عند استخدام اختر-كائن مع scriptblock بسيطة محتويات هذا scriptblock تشكل اسم الخاصية الجديدة على PSCustomObject الذي تم إنشاؤه. بشكل عام، نهج نيستور هو الطريق للذهاب ولكن في المستقبل إذا كنت بحاجة إلى synthensize خصائص مثل هذا ثم استخدام جدول هاش مثل ذلك:

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

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


PS> $newTestContents[0].MyName
abc -test1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top