Powershell ';不能对空值表达式调用方法';错误

Powershell ';不能对空值表达式调用方法';错误,powershell,Powershell,我有一个PowerShell脚本,它将根据用户输入在多台计算机上安装TCP/IP打印机。 该脚本工作正常,但我们希望添加一个保护措施,以便用户不会意外地将打印机安装到不同子网上另一站点的资产上 我添加了以下函数 ### Function to compare subnet of Printer and Asset Function CheckSubnet { param ($PrinterIP, $ComputerName, $PrinterCaption) $Printer =

我有一个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 {
    }
}
现在,当我运行脚本时,我得到以下错误返回

不能对空值表达式调用方法。
在C:\Users\sitblsadm\Desktop\Untitled1.ps1:28 char:1
+$IPSplit=$PrintIP.Split(“.”)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:InvalidOperation:(:)[],运行时异常
+FullyQualifiedErrorId:InvokeMethodOnFull
无法索引到空数组中。
在C:\Users\sitblsadm\Desktop\Untitled1.ps1:29 char:1
+$PrinterSubnet=($IPSPlit[0]+“+$IPSPlit[1]+“+$IPSPlit[2]”)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:InvalidOperation:(:)[],运行时异常
+FullyQualifiedErrorId:NullArray
我理解空数组是因为
$IPSplit
没有给定值,
但我对“不能在空值表达式上调用方法”的理解是,没有为它赋值,但在本例中,我尝试为它赋值。

如果
测试连接
返回超时,
$Printer
为空。如果名称解析失败(DNS服务器上的打印机没有PTR记录,并且打印机不响应WINS),
IPV4Address
为空,因此,
$PrintIP
中会出现空字符串。您可以回退使用
目的地
字段作为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(".")
}

您需要学习如何检查空值和位置。并非每个cmdlet都会抛出错误并停止脚本,它们可以返回null并继续,然后您会突然出现null解除引用异常。

如果
测试连接-ComputerName$PrinterIP-Count 1
失败,
$Printer
$PrintIP
的值将为
$null
。您需要更多的错误处理,或者使用
try catch finally
块,或者检查
$?
自动变量并抛出错误:

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

:$?包含上次操作的执行状态。如果上一次操作成功,则包含TRUE;如果操作失败,则包含FALSE

$PrintIP是否包含值?如果无法访问打印机,则脚本现在会使用您的建议抛出一个错误。我对脚本进行了更改,因为这似乎不是原始错误的原因,现在脚本接受用户对打印机IP的输入,并将其直接用于
$IPSplit