你不能在空值表达式上调用方法?

时间:2015-03-11 21:10:44

标签: powershell

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

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

2 个答案:

答案 0 :(得分:1)

我不确定是什么原因导致您获得空值错误。但要获得名字和姓氏,请使用:

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

您也希望write-hostwrite-output无法打印

答案 1 :(得分: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

由于未找到字符串\s,因此第一个返回-1。然后我们把这个字符串放在John和Smith之间,我们现在得到一个正回报,因为字符串 literal 匹配了。

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

PS C:\Users\Cameron> $name = "John        Smith"

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

第二行代码的作用是将字符串$name拆分为空白区域的。我们返回了第一个元素,即'John'。第二个,未显示,因为它应该是显而易见的是'史密斯'。这两个元素都没有尾随或前导空格(仅基于此示例。里程将因其他字符串而异。)

此外,print命令是Out-Printer的别名。怀疑你是指那个命令,并且很可能像Dane Boulton建议的那样,Write-HostWrite-Output。注意:查看它们以了解重要的区别。前写入梯形图写入输出流的控制台。

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

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