【问题标题】:powershell 'You cannot call a method on a null-valued expression'powershell '您不能在空值表达式上调用方法'
【发布时间】:2020-08-27 08:29:44
【问题描述】:
$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() 会出错

【问题讨论】:

  • 无法复制。也许您的驱动器没有序列号?
  • 试试:"$($drive.SerialNumber)".Trim()

标签: powershell trim


【解决方案1】:

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

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

您要么使用@iRon 提到的技巧,将所有内容括在双引号中(即使输入为NULL,也会创建一个字符串),或者您需要明确检查$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,-10}: {1}" -f 'toString', ${nullVar}?.toString())
Write-Host ("`t{0,-10}: {1}" -f 'trim', ${nullVar}?.trim())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多