InvokeMethodOnNull в powershell при запросе пустого значения - PullRequest
0 голосов
/ 08 января 2020

Мой скрипт powershell запросит и обновит атрибут ldap из репозитория ldap. Но атрибут, который я хотел запросить / обновить, является пустым полем в репозитории ldap. Насколько я знаю, PowerShell не может принять пустое значение, поэтому мой скрипт вернул следующее сообщение об ошибке

 You cannot call a method on a null-valued expression.
At D:\deployment\test.ps1:67 char:17
+ ...               $f = $l.Attributes['String7'].GetValues('string')
+                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull



Я положил Set-StrictMode -Off, чтобы принять нулевое значение, но, похоже, оно не работает должным образом

Пожалуйста, обратитесь к следующему сценарию

 foreach ($l in $r.Entries)
    {

       //some process over here 



        if($ID -eq "xxxxx")
        {


              $N = $l.Attributes['String11'].GetValues('string')

              if($N -eq "something here")
              {

                $f = $list.Attributes['String7'].GetValues('string')
                if($f -eq $null)
                 {
                    //update string7 attribute
                    $l.Attributes['String7'].SetValues("x") 
                 }

              } 
        } 



$r будет моим ответом из репозитория ldap, и String7 по умолчанию пусто

1 Ответ

0 голосов
/ 08 января 2020

Для начала:

  • PowerShell использует символ комментария #, а не //
  • В вашем коде отсутствует последняя фигурная скобка }. (Используя более качественное отступление кода, вы могли бы легко увидеть отсутствующую скобку)

Вставив конструкцию try{..} catch{..}, вы сможете преодолеть полученную ошибку и обновить этот атрибут. , Что-то вроде:

foreach ($l in $r.Entries) {
    # some process over here 
    if($ID -eq "xxxxx") {
        $N = $l.Attributes['imString11'].GetValues('string')
        if($N -eq "something here") {
            try {
                $f = $list.Attributes['String7'].GetValues('string')
            }
            catch {}
            if(!$f) {
                # update string7 attribute
                $l.Attributes['String7'].SetValues("x") 
            }
        } 
    } 
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...