سؤال

تنص الوثائق:

يضيف عضو مخصص محدد من قبل المستخدم بمثيل كائن Windows PowerShell.

ما "كائن Windows PowerShell" يقف؟

هذا يعمل بشكل جيد:

$obj = new-object system.object
$obj | add-member -membertype noteproperty -name Name -value "OK"
$obj.name

ولكن هذا لا:

$obj = @{}

في الواقع، أحاول إضافة عقار إلى خطأ $ [0].

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

المحلول

PowerShell لديه ما يسمى PSOBject وهو عبارة عن مجمع حول أي كائن .NET (أو يمكن أن يكون كائنا مخصصا تماما) وعندما تسمدع عضو الوظيفة الإضافية، يقوم PowerShell بتفويل كائن .NET الحقيقي مع PSOBJECT.

تعتمد طريقة Add-Member Works على ما إذا كنت قد بدأت مع PSOBJECT أم لا. إذا لم تبدأ ب PSOBject، فسوف يقوم Add-Member بإلغاء الإدخال في PSOBJECT وستحتاج إلى إعادة تعيين المتغير من أجل رؤية الكائن المكيف.

لذلك على سبيل المثال:

$x = [Environment]::OSVersion
$x | Add-Member NoteProperty IsVista $true
$x | Format-List   # does not show the new property

هذا لأن الأوسفتون غير ملفوف هو psoBject. يقوم Add-Member بإلغاءه ولكن هذا المجمع يفقد لأنك لا تقوم بإعادة تعيين X $ X إلى كائن ملفوف. على النقيض من هذا السلوك:

$x = New-Object OperatingSystem ('Win32NT', '6.0')
$x | Add-Member NoteProperty IsVista $true
$x | Format-List   # DOES show the new property

وذلك لأن الكائن الجديد يلف بشكل ضمني المثال الجديد في PSOBJECT. لذلك تقوم مكالمة الوظائف الخاصة بك بإضافة أعضاء إلى المجمع الموجود.

العودة إلى الأمام الأول، يمكنك أن تجعلها تعمل كما هو متوقع من خلال تغييرها إلى:

$x = [Environment]::OSVersion
$x = $x | Add-Member NoteProperty IsVista $true -PassThru
$x | Format-List   # DOES show the new property

الآن بعد كل ذلك، فإن السبب في أن Hashtable لا يعمل بالطريقة التي تتوقعها لأن HasHtables يتم التعامل معها بشكل خاص ب PowerShell وسياسة محول Hashtables يستخدم المفاتيح كخصائص (Kinda) ولم تعمل Add-Member كما هو متوقع مع هذا النوع من الكائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top