سؤال

أحاول سرد جميع المجموعات التي تحتوي على عنوان SMTP محدد في المجموعة.يوجد أدناه الكود الذي أستخدمه ولكنه يُخرج كل شيء وليس فقط المجموعات ذات عنوان SMTP المحدد:

$temp = Get-DistributionGroup -ResultSize Unlimited 
foreach ($group in $temp) 
{ 
  if (Get-DistributionGroupMember $group | select -ExpandProperty PrimarySmtpAddress`
   | ForEach-Object {$_.PrimarySmtpAddress -match "contoso.com"}) {

    Write-Output "GroupName:$group " 
    Write-Output "GroupName:$($group.PrimarySmtpAddress) "
    Write-Output "GroupMembers:" 
    Get-DistributionGroupMember $group|ft displayname,primarysmtpaddress
  }
  else 
  {
    Write-Host "null"
  }
}
هل كانت مفيدة؟

المحلول

هذا لا يعمل لأن الخاص بك لو تختبر العبارة فقط ما إذا كان سيتم تنفيذ التعليمات البرمجية الموجودة في الحالة بنجاح، ولا يوجد سبب لفشلها لأي مجموعة.لا يوجد شيء في المنطق يجعل الشرط خاطئًا إذا كان كائن foreach الكتلة لا تجد أي تطابقات.جرب هذا:

foreach ($group in $temp) {
  if ((Get-DistributionGroupMember $group | %{$_.PrimarySmtpAddress}) -match 'contoso\.com') {
    [...]

(Get-DistributionGroupMember $group | %{$_.PrimarySmtpAddress}) يقوم بإنشاء مصفوفة من PrimarySmtpAddress خصائص جميع الأعضاء، ثم لو اختبارات الحالة ما إذا كانت تتطابق مع التعبير العادي (-مباراة يُؤدي تطبيقه على مصفوفة إلى إرجاع مصفوفة من جميع العناصر المتطابقة، لذا يكون صحيحًا إذا كان عنصر واحد على الأقل متطابقًا، وخطأ إذا كان المصفوفة فارغًا).

لاحظ، راجع للشغل، أن السلسلة الموجودة على يمين ملف -مباراة المشغل هو regex, ، وليس سلسلة حرفية.لهذا السبب أضفت الشرطة المائلة العكسية.في التعابير المنطقية، . يطابق أي حرف واحد، لذلك -match 'contoso.com' سوف تتطابق مع سلاسل مثل contososcom و contoso?com.

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