我正在尝试输入“名称”并找到空白,以便找到输入的姓名的第一个和最后一个字母。但它告诉我“你不能在空值表达式上调用方法。”帮助
$name = Read-Host "Please enter the zip of person $count"
$length = $name.Length
$name = $name.split(" ")
write-host $name[0]
答案 0 :(得分:1)
我不确定是什么原因导致您获得空值错误。但要获得名字和姓氏,请使用:
$name = "John Smith"
$name = $name.split(" ")
$name[0] #outputs John
$name[1] #outputs Smith
您也希望write-host
或write-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-Host
或Write-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