参数和PowerShell函数

时间:2009-06-05 19:29:49

标签: 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 x的。我有一个空字符串。

我又去了一些,我改变了“for”循环。我用“-lt 5”替换了“-lt $ repeat”部分,这样我就可以获得固定数量的重复。当我这样做时,我得到以下输出(没有引号):

Repeat-String(“x”,7)

“x 7x 7x 7x 7x 7”

它看起来好像是连接$ str和$ repeat参数,而不是像2个独立的参数那样对它们进行处理。我做错了什么?

4 个答案:

答案 0 :(得分:17)

问题是您需要将代码转换为以下内容

Repeat-string "x" 7

在PowerShell中,每当你在()中放入一组值时,就会创建一个数组。这意味着在您的示例中,您实际上是将一个数组作为单个参数传递给函数。

答案 1 :(得分:6)

这是一种更好的方法,只需将你的(任意)字符串乘以N次重复:

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

PS > Repeat-String JMarsch 3
JMarschJMarschJMarsch

答案 2 :(得分: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...上面经典引语的幽默副产品清单

答案 3 :(得分: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