Параметры и функции PowerShell - PullRequest
5 голосов
/ 05 июня 2009

Я определенно не получаю что-то здесь:

Я создаю простую функцию для репликации строки x раз. У меня странная проблема с параметром - похоже, он не распознает второй параметр. Когда я запускаю функцию, она возвращает пустую строку. Кроме того, я думаю, что эти два параметра объединены в 1. Вот мой код:


Function Repeat-String([string]$str, [int]$repeat) {
  $builder = new-object System.Text.StringBuilder
  for ($i = 0; $i -lt $repeat; $i++) {[void]$builder.Append($str)}
  $builder.ToString()
}

Сначала я ставлю точку для загрузки:

. .\RepeatString.ps1

А потом я выполняю это так:

Repeat-string("x", 7)
Я ожидал строку 7 х. Я получил пустую строку.

Я продолжил ковыряться еще и изменил цикл for. Я заменил часть "-lt $ repeat" на "-lt 5", чтобы получить фиксированное количество повторов. Когда я это сделал, я получил следующий вывод (без кавычек):

Repeat-String ("x", 7)

"x 7x 7x 7x 7x 7"

Похоже, что он объединяет параметры $ str и $ repeat вместо того, чтобы рассматривать их как 2 отдельных параметра. Что я делаю не так?

Ответы [ 4 ]

17 голосов
/ 05 июня 2009

Проблема в том, что вам нужно преобразовать ваш код в следующее

Repeat-string "x" 7

В PowerShell каждый раз, когда вы помещаете группу значений в (), вы создаете массив. Это означает, что в вашем примере вы фактически передаете массив функции в качестве единственного параметра.

6 голосов
/ 20 июля 2011

Известная китайская пословица гласит:

"Дайте человеку рыбу, и вы накормите его на один день. Научите человека ловить рыбу и ты кормишь его на всю жизнь. "

Для космополитически настроенных среди вас оригинал 授人以魚不如授人以漁 и романизация пиньинь Shòu rén yǐ yú bùrú shòu rén yǐ yú. (Я учился говорить на мандарине и писать пиньинь, поэтому я должен практиковать! Любопытно, что вышеупомянутое выражение пиньинь казалось загадкой, но это история для другого времени ...: -)

Теперь, на мой взгляд: JMarsch столкнулся с распространенной ошибкой PowerShell, способной запутать любого, кто привык к «обычным» языкам, и @JaredPar предоставил правильное разрешение. Я утверждаю, что этот ответ сродни тому, как шлепнуть рыбу перед вами!

Только что опубликовано на Simple-Talk.com, Вниз по кроличьей норе: исследование конвейеров, функций и параметров PowerShell обсуждает вышеупомянутую ловушку вместе со многими другими нюансами интерфейса вызова функций. Например, в одном разделе моей статьи рассматриваются тонкие различия между всеми следующими вызовами функции f , большинство из которых не даст то, что вы ожидаете.

f(1,2,3)
f (1,2,3)
f 1,2,3
f (1 2 3)
f 1 2 3

Посмотрите также на скачивание в PDF справочника удобных настенных диаграмм, прилагаемого к статье.

Вот эскиз: PowerShell Functions Quick Reference

(О, и вы можете также посмотреть список юмористических побочных эффектов вышеупомянутой классической цитаты в Дайте человеку рыбу ... )

6 голосов
/ 07 июня 2009

Вот лучший способ, просто умножьте вашу (любую) строку на N повторов:

PS > function Repeat-String([string]$str, [int]$repeat) {  $str * $repeat }
PS > Repeat-String x 7
xxxxxxx

PS > Repeat-String JMarsch 3
JMarschJMarschJMarsch
0 голосов
/ 05 июня 2009

Конечно, ДжаредПар прав.

Мне также нравится использовать встроенную функцию диапазона .. для этого: (обратите внимание, я начинаю с 1 вместо 0)

Function Repeat-String([string]$str, [int]$repeat) {
  $builder = new-object System.Text.StringBuilder
  1..$repeat | %{ [void]$builder.Append($str) }
  return $builder.ToString()
}

Repeat-string "x" 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...