2009-06-05 3 views
5

Это общий вопрос newb. Loving powershell, но я определенно не получаю что-то здесь:Параметры и функции powershell

Я создаю простую функцию для репликации строки x раз. У меня возникла какая-то странная проблема с параметром - он, кажется, не распознает второй параметр.
Когда я запускаю функцию, она возвращает пустую строку. Кроме того, я думаю, что это комков на 2 параметра в 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
я Execute так:
Repeat-string("x", 7)
I ожидается строка из 7 x. Я получил пустую строку.

Я пошел еще немного, и я изменил цикл «для». Я заменил часть «-lt $ repeat» на «-lt 5», чтобы получить фиксированное количество повторов. Когда я сделал это, я получил следующий результат (без кавычек):
Repeat-String ("х", 7)
"х 7x 7x 7x 7x 7"
Это выглядит, как будто он конкатенации $ str и $ repeat вместо обработки их как 2 отдельных параметра. Любая идея, что я делаю неправильно?

ответ

17

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

Repeat-string "x" 7 

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

+0

Спасибо! Я знал, что делаю что-то глупое - просто не был уверен, что. – JMarsch

+0

@JMarsch, все это срабатывает хотя бы один раз. Это действительно раздражает :( – JaredPar

+0

Ненавижу это! Но вы привыкнете к этому ... – Philippe

0

Конечно, JaredPar прав.

Я хотел бы использовать встроенную функцию диапазона .. для этого слишком: (обратите внимание, я начинаю на 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 
+0

Спасибо - не знал о функции диапазона. Мне нужно будет поместить книгу в powershell в мой список чтения. Думаю, в этот момент я мог бы также посмотреть/дождаться версии powershell 2.0) – JMarsch

6

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

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

PS > Repeat-String JMarsch 3 
JMarschJMarschJMarsch 
+0

Каждая новая вещь, которую я узнаю о PowerShell, просто показывает мне, насколько она крута. Спасибо за то, что Shay +1 – JMarsch

+0

PowerShell ROCKS ;-) –

+0

В некотором смысле комментарий Шей Леви показывает, что мы могли бы просто использовать функцию «multiply string» ** вместо ** записи пользовательской функции. –

6

Отмеченных китайская пословица состояние:

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

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

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

Только что опубликованный на Simple-Talk.com, Down the Rabbit Hole: A Study in PowerShell Pipelines, Functions, and Parameters обсуждает вышеупомянутую ловушку наряду со многими другими нюансами функционально-вызывающего интерфейса. Например, в одном из разделов моей статьи рассматриваются тонкие различия между всеми следующими вызовами для функции 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

(О, и вы можете также проверить список юмористического спина-офф вышеприведенной классической цитаты в Give a man a fish...)

+0

Отличная статья. Спасибо за это. – crush

+0

Что делает рыба с этим? :) – bgmCoder

Смежные вопросы