电源外壳'You cannot call a method on a null-valued expression'


$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((是一个方法,因此必须设置一个值才能使用它。在您的情况下,并非所有磁盘都存在序列号,但这不是问题(取决于磁盘的固件(。

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

要么使用@iRon提到的用双引号括起everthing的技巧(即使输入为NULL,也会创建一个String(,要么需要检查$NULL的显式性。

使用PS7,您可以另外使用";NULL条件运算符";

请参阅:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7#空条件运算符--和-

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,-10}: {1}" -f 'toString', ${nullVar}?.toString())
Write-Host ("`t{0,-10}: {1}" -f 'trim', ${nullVar}?.trim())

相关内容

最新更新