Вы сделали значительные изменения в ваш пост. Раньше:
$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
Прохладный, что работает! Итак, каков метод поиска конкретных символов из строк снова в powershell? – OysterMaker
Хорошо, что вы были на правильном пути, вы можете сделать 'indexof (" J ")', который даст вам позицию в строке, где находится буква J. –
Ну, проблема с этим была бы я не знаю, что будет за переменная $ name, пока после того, как человек ее введет. – OysterMaker