参数和PowerShell函数

参数和PowerShell函数,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++) {[v

我肯定没有得到什么东西:

我正在创建一个简单的函数,将字符串复制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

然后我像这样执行它:

重复字符串(“x”,7)

我以为会有一连串的7个x。我得到一条空字符串

我又四处摸索了一下,我改变了“for”循环。我将“-lt$repeat”部分替换为“-lt 5”,以便获得固定数量的重复。当我这样做时,我得到了以下输出(不带引号):

重复字符串(“x”,7)

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


它看起来好像是在连接$str和$repeat参数,而不是将它们当作两个单独的参数。我做错了什么?

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

Repeat-string "x" 7

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

当然,JaredPar是正确的

我也喜欢使用内置范围函数
(注意,我从1开始,而不是从0开始)


这里有一个更好的方法,只需将您的(任意)字符串乘以N个重复:

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

PS > Repeat-String JMarsch 3
JMarschJMarschJMarsch

中国有句著名的谚语说:

“给一个人一条鱼,你就喂他一天。教一个人钓鱼 而你却要养活他一辈子。”

对于你们当中的世界主义者来说,原文是
授人以魚不如授人以漁
拼音罗马化是shuòrényǐyúbùròshu rényǐyú
。 (我一直在学习说一点普通话和写拼音,所以我不得不练习!奇怪的是,我发现上面的拼音表达似乎是一个谜,但这是另一个时代的故事…:-)

现在谈谈我的观点:JMarsch遇到了一个常见的PowerShell陷阱,可能会绊倒任何习惯于“传统”语言的人,@JaredPar提供了正确的解决方案。不过,我认为,这个答案就像是在你面前击落一条鱼

刚刚发布在Simple-Talk.com上,讨论了上述缺陷以及函数调用接口的许多其他细微差别。例如,我文章的一个部分介绍了以下所有函数调用f之间的细微差别,其中大多数调用不会产生您所期望的结果

f(1,2,3)
f (1,2,3)
f 1,2,3
f (1 2 3)
f 1 2 3
也可以从PDF下载本文附带的便利挂图参考资料

以下是缩略图:


(哦,您可能还想查看上述经典名言的幽默衍生产品列表)

谢谢!“我知道我在做一些愚蠢的事情——只是不知道是什么。”杰玛什,每个人都至少被这件事绊倒一次。这真的很烦人:(谢谢——我不知道范围函数。我必须在我的阅读列表中加入一本关于powershell的书。(我想在这一点上,我还是看看/等待一本powershell 2.0的书吧)关于powershell,我了解到的每一件新事物都向我展示了它有多酷。感谢分享,Shay+1在某种程度上,Shay Levy的评论表明,我们可以使用“乘法字符串”功能,而不是编写用户定义的函数。很棒的文章。谢谢。鱼与此有什么关系?:)
f(1,2,3)
f (1,2,3)
f 1,2,3
f (1 2 3)
f 1 2 3