لماذا تحتاج حجة نص PowerShell إلى نسخها إلى متغير محلي؟

StackOverflow https://stackoverflow.com/questions/2380934

  •  24-09-2019
  •  | 
  •  

سؤال

لديّ نص PowerShell V1.0 بسيط للغاية لقتل العمليات بالاسم:

$target = $args[0]
get-process | where {$_.ProcessName -eq $target} | stop-process -Force

الذي يعمل. ومع ذلك ، عندما كان لدي للتو

get-process | where {$_.ProcessName -eq $args[0]} | stop-process -Force

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

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

المحلول

ظهر هذا أمس في آخر بريد. أساسا نص scriptblock { <script> } تحصل على $ args التي تمثل الحجج التي لم يتم تحديد اسمها تم تمريرها على سبيل المثال:

PS> & { $OFS=', '; "`$args is $args" } arg1 7 3.14 (get-date)
$args is arg1, 7, 3.14, 03/04/2010 09:46:50

يستخدم CMDLET الذي يتواجد في الكائن برنامجًا نصيًا لتوفير البرنامج النصي التعسفي الذي يقيمه إما صحيحًا أو خطأ. في حالة الكائنات ، لا توجد حجج لم يتم تحديد اسمها إلى scriptblock ، لذا يجب أن تكون args $ فارغة.

لقد وجدت عملًا واحدًا. الشخص الذي أود أن أقترحه هو استخدام معلمة تسمية على سبيل المثال:

param($Name, [switch]$WhatIf)
get-process | where {$_.Name -eq $Name} | stop-process -Force -WhatIf:$WhatIf
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top