参数中的Powershell变量展开

参数中的Powershell变量展开,powershell,exchange-server,Powershell,Exchange Server,我正在编写这个powershell脚本来处理exchange邮箱,其中一个参数(在我必须运行的许多命令中)需要在RecipientFilter下嵌入一个变量。无论我做什么类型的扩展,它都会逐字计算它(作为$prefix),而不是扩展它。我不确定是否有一种特殊的方式让我逃离它,或者什么。想法 $prefix="FAKEDOM" New-AddressList -name "AL_${prefix}_Contacts" -RecipientFilter {(RecipientType -eq 'M

我正在编写这个powershell脚本来处理exchange邮箱,其中一个参数(在我必须运行的许多命令中)需要在RecipientFilter下嵌入一个变量。无论我做什么类型的扩展,它都会逐字计算它(作为$prefix),而不是扩展它。我不确定是否有一种特殊的方式让我逃离它,或者什么。想法

$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}`" )"
试试这个:

New-AddressList -name "AL_$($prefix)_Contacts" ...
请注意我添加的额外美元符号。

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

还请注意,下划线字符将假定为替换字符串中变量名称的一部分,因此您需要使用
$($variableName)
${variableName}
。也就是说,您不能这样做替换:
“vanilla\u$variableName\u草莓”
,Powershell将查找名为
variableName\u草莓”
,但该变量不存在

总而言之,这就是你需要的:

$prefix="FAKEDOM"

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

您的编辑清楚地表明,第一次使用
$prefix
没有问题,是筛选器造成了问题。
-RecipientFilter
是一个字符串属性,但您没有将筛选器表达式括在任何类型的引号中。而是使用
{}
方括号。一般来说这很好,但是当通过
{}
方括号指定字符串时,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
值周围添加内部单引号):

无论是
$($variableName)
还是
${variableName}
都不适用于我使用Powershell 4在参数中进行变量扩展,但以下情况确实适用:

$prefix="FAKEDOM"

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

没有名为“
fakedom
”的变量,至少在发布的代码OP中没有。@latkin:那么OP没有发布他所有的代码。这有什么大不了的吗?我只是在展示这个概念。谢谢你们投票否决了一个正确的解决方案。你们太棒了!我的错误,我有几个版本的代码正在运行,并且粘贴了错误的变量不可行。主帖子已更新,第二部分(结尾)不起作用。美元(前缀)在-name参数中工作正常。OP包含了所有看起来的代码-变量的名称仅为
prefix
,而不是
fakedom
。如果您认为缺少一些代码,我建议您在回答中指出这些代码。@latkin:有一个非常有用的技巧可以帮助您了解问题的核心,这是随着年龄和年龄的增长而产生的经验。特别是当你处理商业世界时,你知道不要去选择缺少的分号等。我用正确的变量名更新了我的答案。我编辑了原始帖子,变量和大括号是我的错误。总体问题是$prefix的第二次使用(在代码末尾),第一个${prefix}工作正常。很高兴这起作用,我发现这是另外一个在查询中引用的问题。我将更新以说明这一点。@Neolik-解决提问者问题的答案,给出示例代码,并链接到相关的官方文档在当今世界获胜。@Neolik-你的意思是你不能争辩时间不重要吗?不管怎样,你r答案未说明(最终不正确)假设,仍然没有更新,以解决OP现在明确指出的真正问题(过滤器,而不是
-Name
参数)。我之所以发表评论,首先是因为@latkin在他的回答中提供了一些很好的细节。我尊重这一点,而不是完全不作解释。对于试图学习Powershell的人来说,这种类型的回答是最好的。@Devtron:嗯,我发表评论的原因是latkin先生的态度。积极进取,努力教育每个人是非常重要的不是你如何解决问题。首先是一个否决票,然后是一个关于他有多酷的夸张解释。即使我在我的假设中犯了错误,也不是这样做的好理由。进一步的讨论不是这样的一部分,所以让我们现在就在这里结束它。你的代码已经更新,但问题文本仍然提到$fakedom。唉,更新了o再来一点,谢谢
$prefix="FAKEDOM"

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