【问题标题】:You cannot call a method on a null-valued expression?您不能在空值表达式上调用方法吗?
【发布时间】:2017-06-27 04:54:33
【问题描述】:

我正在尝试输入“姓名”并找到空格,以便找到输入的名字和姓氏的第一个和最后一个字母。但它告诉我“你不能在空值表达式上调用方法。”帮忙?

$name = Read-Host "Please enter the zip of person $count"
$length = $name.Length
$name = $name.split(" ")
write-host $name[0]

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您对帖子进行了重大更改。以前是:

    $name = Read-Host "Please enter the name of person $count"
    $length = $name.Length
    
    $pos = $name.IndexOf('\s')
    print $pos
    

    让我们忽略$length 行,因为您不使用它。看起来您正在尝试使用正则表达式在第一个空格上进行拆分。您正在使用.IndexOf(),如果您检查重载会看到它需要字符串或字符。不是惊天动地,但关键是它正在寻找字符串文字并且不支持正则表达式。考虑以下陈述

    PS C:\Users\Cameron> "John Smith".IndexOf('\s')
    -1
    
    PS C:\Users\Cameron> "John\sSmith".IndexOf('\s')
    4
    

    第一个返回-1,因为没有找到字符串\s。然后我们把那个字符串放在 John 和 Smith 之间,我们现在得到一个正返回,因为字符串 literal 被匹配了。

    您可能尝试做的是使用-split,我基于您的原始问题和编辑。 -split 支持正则表达式。

    PS C:\Users\Cameron> $name = "John        Smith"
    
    PS C:\Users\Cameron> ($name -split '\s+')[0]
    John
    

    第二行代码所做的是将字符串$name 拆分到 空白处。我们返回了第一个元素,即“John”。第二个没有显示,因为它应该很明显是'Smith'。两个元素都没有尾随或前导空格(仅基于此示例。里程因其他字符串而异。)

    另外,命令printOut-Printer 的别名。怀疑您的意思是该命令,并且很可能像 Dane Boulton 建议的那样寻找Write-HostWrite-Output。注意:查找它们以了解重要的区别。前者写入控制台,梯形图写入输出流。

    最后一个好的猜测是该错误是由于在调用 $name.IndexOf('\s')$name 为 null 引起的。也很容易模拟。

    PS C:\Users\Cameron> $something = $null
    
    PS C:\Users\Cameron> $something.Method()
    You cannot call a method on a null-valued expression.
    At line:1 char:1
    + $something.Method()
    + ~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
    

    【讨论】:

      【解决方案2】:

      我不确定是哪个导致您收到空值错误。但是要获取名字和姓氏,只需使用以下命令:

      $name = "John Smith"    
      $name = $name.split(" ")
      $name[0] #outputs John
      $name[1] #outputs Smith
      

      您还希望write-hostwrite-output 不打印

      【讨论】:

      • 酷,行得通!那么在powershell中再次从字符串中查找特定字符的方法是什么?
      • 好吧,你在正确的轨道上,你可以做indexof("J"),这会给你字母J在字符串中的位置。
      • 那么问题是我不知道 $name 变量将是什么,直到有人输入它。
      • 嗯,我不知道你在找什么字符,但如果你想说名字的第一个字符,你可以做$name[0].substring(0,1),它会给你名字的第一个字母
      • 对,所以当我尝试使用拆分方法并写入主机 $name[0] 时,它只返回拆分字符串的第一个字符。所以如果我输入“Brandon Smith”,它会打印“B”。这不对吧?
      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多