لماذا تحتاج حجة نص PowerShell إلى نسخها إلى متغير محلي؟
-
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
لا تنتمي إلى StackOverflow