2015-07-10 3 views
1

Не имея большой удачи в моем сценарии Powershell, так что любая помощь будет замечательной! То, что я пытаюсь сделать, это ссылаться на тестовый файл, содержащий строки имен пользователей, и сравнивать его с таблицей Excel в столбце A1. Если существует, он должен затушить имя пользователя.Вы не можете вызвать метод в нулевом выражении

$users = Get-Content "E:\temp\test.txt" 
foreach ($user in $users) { 

    set-aduser $user -fax " " 

    $answer1 = read-host "Please Make a Selection" 
    if ($answer1 -eq 1){ 
     $location="Melbourne" 
    } 
    if ($answer1 -eq 2){ 
     $location="Sydney" 
    } 
    if ($answer1 -eq 3){ 
     $location="Adelaide" 
    } 
    if ($answer1 -eq 4){ 
     $location="Brisbane" 
    } 
    if ($answer1 -eq 5){ 
     $location="Perth" 
    } 

    $ExcelPath = 'E:\temp\FX MFD UserPIN.xlsx' 
    $Excel = New-Object -ComObject Excel.Application 
    $Excel.Visible = $true 
    $ExcelWorkBook = $Excel.Workbooks.Open($ExcelPath) 
    $ExcelWorkSheet = $Excel.WorkSheets.item("$location") 


    $Range = $ExcelWorkSheet.Range("A1").EntireColumn 
    $Search = $Range.find($user) 

    If($Search.value() -contains $user) 
    { 

     Write-Host "User FOUND, removing now" 
     $Search.value() = "" 
    } 
    else { 
     Write-Host "User NOT FOUND" 
    } 
} 

Код ошибки заключается в следующем:

You cannot call a method on a null-valued expression. 
At E:\temp\testsest.ps1:35 char:12 
+   If($Search.value() -contains $SearchString) 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
+ FullyQualifiedErrorId : InvokeMethodOnNull 

Как заменить $ Поиск получить $ пользователю?

+2

выглядит как $ Range.find ($ user) возвращает null. Вы должны проверить это или предоставить часть своего листа excel. –

+0

Отметьте сообщение от Vesper об исключении выражения с нулевым значением: http://stackoverflow.com/questions/31335195/you-cannot-call-a-method-on-a-null-valued-expression-general –

ответ

3

Range.Find() returns Nothing if no match is found.

Поэтому, прежде чем проверить, если является матч, вы должны проверить, есть ли нулевое значение в $Search.

if ($Search -ne $null) { 
    if ($Search.value -contains $user) 
    { 
     Write-Host "User FOUND, removing now" 
     $Search.value = "" 
    } 
    else { 
     Write-Host $Search.value," what did we find?!" 
    } 
} 
else { 
    Write-Host "User NOT FOUND" 
} 

Кроме того, value не метод, это свойство, поэтому не используйте круглые скобки.

0

Спасибо Vesper. Я сделал еще пару изменений и теперь могу подтвердить, что он работает.

if ($Search -ne $null) { 

     if ($Search.text -contains $user) 
     { 
      Write-Host "User FOUND, removing now" 
      $Range.replace($Search,"") 
     } 
     else { 
      Write-Host $Search.text," what did we find?!" 
     } 
    } 
    else { 
     Write-Host "User NOT FOUND" 
    }