2015-03-11 2 views
1

Я пытаюсь ввести «имя» и найти пробел, чтобы я мог найти первую и последнюю букву первого и последнего имени. Но он говорит мне: «Вы не можете вызывать метод с нулевым значением». Помогите?Вы не можете вызвать метод для выражения с нулевым значением?

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

ответ

1

Я не уверен, что вызывает у вас ошибку нулевого значения. Но, чтобы получить первое и последнее имя просто используйте:

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

Также вы хотите write-host или write-output не печатает

+0

Прохладный, что работает! Итак, каков метод поиска конкретных символов из строк снова в powershell? – OysterMaker

+0

Хорошо, что вы были на правильном пути, вы можете сделать 'indexof (" J ")', который даст вам позицию в строке, где находится буква J. –

+0

Ну, проблема с этим была бы я не знаю, что будет за переменная $ name, пока после того, как человек ее введет. – OysterMaker

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 не было найдено. Затем мы помещаем эту строку между Джоном и Смитом, и теперь получаем положительный доход, так как строка буквально была сопоставлена.

Что вы, возможно, пытались сделать, это использовать -split, который я основываюсь на исходном вопросе и редактировании. -split поддерживает регулярные выражения.

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

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

Что вторая строка кода сделал разделилась строку $name на группы белого пространства. Мы вернули первый элемент, который был бы «Джоном». Второй, не показанный, так как это должно быть очевидно, это «Смит». Ни один из элементов не имеет заднего или ведущего белого пространства (только на этом примере. Пробег будет отличаться по другим строкам.)

Кроме того, команда print является и имеет псевдоним для Out-Printer. Вы сомневаетесь, что вы имели в виду эту команду и, скорее всего, искали, как предложил Дейн Боултон, 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 
Смежные вопросы