powershell'您不能在空值表达式上调用方法' PS7示例:

问题描述

$DrivesObject = Get-disk | sort-object -Property Number 
$DrivesTable = New-Object System.Data.DataTable
$DrivesTable.Columns.AddRange(@("Number","FriendlyName","SerialNumber"))
try
{
    foreach ($drive in $DrivesObject)
    { [void]$DrivesTable.Rows.Add(($drive.Number),($drive.FriendlyName).Trim(),($drive.SerialNumber).Trim()) }
}
catch
{ Write-Host $_.Exception.Message; Exit }
$DrivesTable

在运行此脚本的地方,出现错误“您不能在空值表达式上调用方法”。 但是如果我将($ drive.SerialNumber).Trim()替换为($ drive.SerialNumber),则脚本将运行而不会出错。请帮助为什么添加.Trim()会导致错误

解决方法

由于Trim()是一种方法,因此必须设置一个值才能使用它。 对于您而言,并非所有磁盘都存在SerialNumber,但这不是问题(取决于磁盘的固件)。

如果对象/变量/属性不存在(NULL),则方法将不起作用,并且将引发错误。使用这种方法之前,您需要检查一下。

您可以使用@iRon提到的技巧,将所有内容都用双引号引起来(即使输入为NULL也会创建一个String),或者您需要显式检查$ NULL。

在PS 7中,您还可以使用“ NULL条件运算符”

请参阅: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7#null-conditional-operators--and-

PS7示例:

$nullVar = $null

Write-Host 'Default property accessor (will throw an error)' -ForegroundColor Yellow
Write-Host ("`t{0,-10}: {1}" -f 'toString',$nullVar.toString())
Write-Host ("`t{0,-10}: {1}" -f 'trim',$nullVar.trim())

Write-Host 'Null-conditional operators (works wihtout errors)' -ForegroundColor Yellow
Write-Host ("`t{0,${nullVar}?.toString())
Write-Host ("`t{0,${nullVar}?.trim())