PowerShell变量替换问题:始终获取变量字面量而非值
PowerShell Here-String 变量替换问题
问题情况
我是PowerShell新手,用Here-String定义$filter变量时,始终嵌入的是变量名称而非它的字符串值,试了各种语法都没解决。实际要用到的筛选字符串很长,用Here-String是为了排版清晰方便阅读。手动把地址字符串直接插进去时代码能正常运行,现在需要正确的语法来构建这个长字符串。
代码示例
$myString = 'My street Address' $filter = @' ( (RecipientType -eq 'UserMailbox') -and (StreetAddress -eq $myString ) ) '@
期望输出
C:\W\system32> $filter ( (RecipientType -eq 'UserMailbox') -and (StreetAddress -eq 'My street Address') )
实际输出
C:\W\system32> $filter ( (RecipientType -eq 'UserMailbox') -and (StreetAddress -eq $myString) )
这个$filter要作为Exchange中DynamicDistributionGroup的RecipientFilter值使用,所以这个问题对我很关键。
解决方法
PowerShell里的单引号Here-String(@'...'@)不会解析变量和转义字符,要实现变量替换,必须改用双引号Here-String(@"..."@)。另外字符串里的单引号不需要额外转义,直接保留就行。
修改后的代码:
$myString = 'My street Address' $filter = @" ( (RecipientType -eq 'UserMailbox') -and (StreetAddress -eq '$myString') ) "@
验证结果
执行修改后的代码,输出就会和你期望的一致:
C:\W\system32> $filter ( (RecipientType -eq 'UserMailbox') -and (StreetAddress -eq 'My street Address') )
额外说明
- 单引号Here-String适合不需要变量替换的纯文本场景,能完全保留你输入的所有内容。
- 双引号Here-String会自动解析其中的变量、子表达式(
$(...))和转义字符,刚好适合你这种需要动态拼接长字符串的场景。
内容的提问来源于stack exchange,提问作者Bee Kay
相关产品推荐
相关产品推荐

