2015-07-09 5 views
1

У меня есть сценарий PowerShell, который установит принтер TCP/IP на несколько компьютеров на основе ввода пользователем. Сценарий работал нормально, но мы хотели добавить его в защиту, чтобы пользователь не мог случайно установить принтер на объект на другом сайте в другой подсети.'Вы не можете вызывать метод в нулевом выражении' Ошибка

я добавил следующую функцию

### Function to compare subnet of Printer and Asset 
Function CheckSubnet { 
    param ($PrinterIP, $ComputerName, $PrinterCaption) 
    $Printer = Test-Connection -ComputerName $PrinterIP -Count 1 
    $PrintIP = $Printer.IPV4Address.IPAddressToString 
    $IPSplit = $PrintIP.Split(".") 
    $PrinterSubnet = ($IPSPlit[0]+"."+$IPSplit[1]+"."+$IPSplit[2]) 
    $getip = Test-Connection -ComputerName $ComputerName -Count 1 
    $IPAddress = $getip.IPV4Address.IPAddressToString 
    $AssetIP = $IPAddress.Split(".") 
    $AssetSubnet = ($AssetIP[0]+"."+$AssetIP[1]+"."+$AssetIP[2]) 
    If ($PrinterSubnet -ne $AssetSubnet){ 
     Write-Host $ComputerName 'is not on the same subnet as ' $PrinterCaption 
     $UserInput = Read-Host 'do wish to install anyway? Y/N' 

     If ($UserInput -eq "Y") { 
     } Else { 
      Continue 
     } 
    } Else { 
    } 
} 

Теперь, когда я запускаю скрипт я получаю следующее возвращаемой ошибки

You cannot call a method on a null-valued expression. 
At C:\Users\sitblsadm\Desktop\Untitled1.ps1:28 char:1 
+ $IPSplit = $PrintIP.Split(".") 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

Cannot index into a null array. 
At C:\Users\sitblsadm\Desktop\Untitled1.ps1:29 char:1 
+ $PrinterSubnet = ($IPSPlit[0]+"."+$IPSplit[1]+"."+$IPSplit[2]) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : NullArray 

Я понимаю, нулевой массив из-за $IPSplit не присваивается значением, Но мое понимание того, что вы не можете вызвать метод в значении с нулевым значением, состоит в том, что ему ничего не назначено, но в этом случае я пытаюсь присвоить ему значение.

+1

do $ PrintIP содержит значение? –

+0

Возможный дубликат [Вы не можете вызвать метод с нулевым выражением - общий] (http://stackoverflow.com/questions/31335195/you-cannot-call-a-method-on-a-null-valued- expression-general) –

ответ

2

Если Test-Connection -ComputerName $PrinterIP -Count 1 не работает, $Printer и $PrintIP будут иметь значение $null. Вам нужно больше обработки ошибок, либо использовать try-catch-finally блок, или проверьте $? автоматическую переменную и выдаст ошибку:

$Printer = Test-Connection -ComputerName $PrinterIP -Count 1 
if(-not $?){ 
    throw "Printer unavailable" 
} 

Explanation: $? Содержит статус выполнения последней операции. Он содержит TRUE, если последняя операция выполнена успешно, и FALSE, если она не удалась.

+0

С помощью вашего предложения скрипт теперь выдает ошибку, если принтер недоступен. Я внес изменения в сценарий, поскольку это, по-видимому, не является причиной исходной ошибки, теперь сценарий принимает пользователей для ввода IP-адресов принтеров и использует их непосредственно для '$ IPSplit' –

2

Если Test-Connection возвращает таймауты, $Printer - null. Если есть ошибка разрешения имен (нет записи PTR для принтера на DNS-сервере, и принтер не отвечает на WINS), IPV4Address пуст, поэтому вы получаете нулевую строку в $PrintIP. Вы можете отказаться от использования поля Destination в качестве IP-адреса или захватить простой $PrinterIP, так как в этом случае $PrinterIP будет содержать IP-адрес.

if ($PrintIP -eq $null) { continue } # can't add unresponsive printer 
if ([String]::IsNullOrEmpty($PrintIP.IPV4Address)) { 
    $IPSplit = $PrinterIP.Split(".") 
} else { 
    $IPSplit = $PrintIP.Split(".") 
} 

Вам нужно научиться проверять нули и где. Не каждый командлет выдает ошибки и останавливает скрипт, они могут возвращать значение null и продолжить, а затем исключение исключений для удаления исключений из списка исключений.

Смежные вопросы