【问题标题】:Powershell variable expansion in parameters参数中的Powershell变量扩展
【发布时间】:2012-10-16 06:59:05
【问题描述】:

我正在处理这个 powershell 脚本来处理交换邮箱,其中一个参数(在我必须运行的许多命令中)需要在 RecipientFilter 下嵌入一个变量。无论我做什么类型的扩展,它总是按字面意思(作为$前缀)而不是扩展它。我不确定是否有一种特殊的方式我应该逃避它,或者什么。想法?

$prefix="FAKEDOM"

New-AddressList -name "AL_${prefix}_Contacts" -RecipientFilter {(RecipientType -eq 'MailContact') -and (CustomAttribute15 -eq $prefix)}

编辑:固定变量名。请注意,问题是针对 $prefix 的第二次使用,第一次使用正常。

编辑:工作解决方案:

 New-AddressList -name "AL_${prefix}_Contacts" -RecipientFilter "(RecipientType -eq 'MailContact') -and (CustomAttribute15 -eq `"${prefix}`" )"

【问题讨论】:

  • 您的代码已更新,但问题文本仍然提到 $fakedom。
  • 叹息,再次更新,谢谢

标签: powershell exchange-server


【解决方案1】:

试试这个:

New-AddressList -name "AL_$($prefix)_Contacts" ...

注意我添加的额外美元符号。

【讨论】:

  • 没有名为fakedom的变量,至少在OP发布的代码中没有。
  • @latkin:然后 OP 没有发布他拥有的所有代码。有什么大不了的吗?我只是展示这个概念。并感谢您对这样做的人提出正确的解决方案。你们太棒了!
  • 我的错误,我有几个版本的这个工作并粘贴了错误的变量。主帖已更新,第二部分(最后)不起作用。 $(prefix) 在 -name 参数中工作正常。
  • OP 已经包含了所有看起来的代码 - 变量被简单地命名为 prefix,而不是 fakedom。如果您认为缺少一些代码,那么我建议您在回答中指出这一点。
  • @latkin: 有一个非常有用的技能可以看清问题的核心,它来自于年龄和经验。特别是如果您处理商业世界,您知道不要选择缺少分号等。我用正确的变量名称更新了我的答案。
【解决方案2】:

您的变量(至少在示例代码中)被命名为 $prefix,而不是 $fakedom。您需要在扩展中使用正确的变量名。

另请注意,下划线字符将被假定为替换字符串中变量名的一部分,因此您需要使用$($variableName)${variableName}。也就是说,你不能做这样的替换:"vanilla_$variableName_strawberry",Powershell 会寻找一个名为variableName_Strawberry" 的变量,它并不存在。

所有,这就是你需要的:

$prefix="FAKEDOM"

New-AddressList -name "AL_${prefix}_Contacts" -RecipientFilter {(RecipientType -eq 'MailContact') -and (CustomAttribute15 -eq $prefix)}

编辑

您的编辑清楚地表明第一次使用$prefix 没问题,是过滤器造成了麻烦。 -RecipientFilter 是一个 string 属性,但您没有将过滤器表达式括在任何类型的引号中。相反,您使用{} 括号。一般来说这很好,但是当您的字符串通过{} 括号指定时,Powershell 不会扩展变量。

PS> function Parrot([string] $Message){ $message }
PS> $food = 'cracker'
PS> Parrot {Polly want a $food ?}
Polly want a $food ?

你需要改为使用双引号:

PS> Parrot "Polly want a $food ?"
Polly want a cracker ?

因此您的过滤器应如下所示(在 $prefix 值周围添加内部单引号):

-RecipientFilter "(RecipientType -eq 'MailContact') -and (CustomAttribute15 -eq '$prefix')"

【讨论】:

  • 我编辑了原始帖子,变量和大括号是我的错误。总体问题是第二次使用 $prefix(在代码末尾),第一个 ${prefix} 工作正常。
  • 很高兴这有效,我发现这也是在查询中引用 within 的问题。我将更新以显示这一点。 @Neolisk - 解决提问者问题的答案,提供示例代码,并链接到当今世界的相关官方文档。
  • @Neolisk - 你的意思是你不能争辩说时间没有重要吗?无论如何,您的回答做出了未说明(最终不正确)的假设,并且仍未更新以解决 OP 现在明确指出的真正问题(过滤器,而不是 -Name 参数)。
  • 我首先发表评论的原因是因为@latkin 在他的回答中提供了一些很好的细节。我尊重这一点,而不是根本没有解释。对于尝试学习 Powershell 的人来说,这种类型的答案是最好的。
  • @Devtron:嗯,我评论的原因是拉特金先生的态度。积极进取并试图教育每个人并不是你解决问题的方式。首先是投反对票,然后是对他有多酷的臃肿解释。即使我的假设确实犯了错误,也不是这样做的好理由。进一步的讨论不是 SO 的一部分,所以让我们现在就在这里完成吧。
【解决方案3】:

$($variableName)${variableName} 都没有为我使用 Powershell 4 在参数中进行变量扩展工作,但以下操作:

$prefix="FAKEDOM"

New-AddressList -name ("AL_" + $prefix + "_Contacts") -RecipientFilter {(RecipientType -eq 'MailContact') -and (CustomAttribute15 -eq $prefix)}

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2012-09-07
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多