2009-06-05 124 views
5

這是一個全新的問題。愛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
然後我執行這樣的:
Repeat-string("x", 7)
我預計會有7個字符串。我有一個空的字符串。

我去了一些更多,我改變了「for」循環。我用「-lt 5」替換了「-lt $ repeat」部分,這樣我會得到固定的重複次數。當我這樣做,我得到了下面的輸出(不帶引號):
重複字符串(「X」,7)
「×7×7×7×7×7」
它看起來好像是串接$ str和$ repeat參數,而不是像2個單獨的參數那樣處理它們。任何想法我做錯了什麼?

回答

17

的問題是,您需要將代碼轉換爲以下

Repeat-string "x" 7 

在PowerShell中任何時候你把一組值()內的要創建一個數組。這意味着在你的示例中,你實際上將一個數組作爲單個參數傳遞給函數。

+0

謝謝!我知道我在做一些愚蠢的事 - 只是不確定是什麼。 – JMarsch 2009-06-05 19:33:20

+0

@JMarsch,每個人都至少被一次絆倒。這真的很煩人:( – JaredPar 2009-06-05 19:33:46

+0

我討厭這個!但是你已經習慣了它...... – Philippe 2009-06-08 13:13:38

0

JaredPar當然是對的。

我喜歡使用內置的range函數..本太:(注意我開始以0代替1)

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

謝謝 - 不知道範圍函數,我將不得不在Powerbook中加入一本關於我的閱讀列表的書。我想在這一點上,我不妨看看/等待一個PowerShell 2.0的書) – JMarsch 2009-06-05 19:38:39

6

這裏有一個更好的辦法,只是用N重複乘以你的(任何)字符串:

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

PS > Repeat-String JMarsch 3 
JMarschJMarschJMarsch 
6

一位著名的中國諺語說:

「授人以魚和y ou喂他一天。教人以漁 你可以喂他一輩子。」

對於國際化的,頭腦的人,原來是授人以魚不如授人以漁 和拼音法是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...也檢查出上述經典報價幽默分拆名單)