Skype for Business:使用变量过滤LineUri的服务器端查询无效求助
解决Skype for Business服务器端变量过滤LineUri失效的问题
这是个很典型的PowerShell与Skype for Business cmdlet交互的坑,我来帮你理清原因并给出解决方案!
问题根源
Get-CsUser的-Filter参数看起来用的是PowerShell脚本块语法,但实际上它底层是基于Active Directory的LDAP查询语法——大括号只是语法糖,里面的变量并不会被PowerShell自动解析替换成实际值。
当你执行:
$lineuri = 56660 Get-CsUser -Filter { lineuri -like "*$lineuri" }
实际传递给AD的过滤条件是查找lineuri包含字符串$lineuri的用户,而不是你定义的56660,所以自然不会返回任何结果。而直接写固定值时,AD能直接识别这个静态过滤条件,所以能正常返回结果。
正确解决方案
要让变量生效,你需要用字符串形式的过滤条件,让PowerShell先解析变量再传递给-Filter参数:
方案1:双引号字符串拼接
$lineuri = "56660" Get-CsUser -Filter "lineuri -like '*$lineuri'"
双引号会让PowerShell先把$lineuri替换成实际值56660,最终传递给-Filter的是lineuri -like '*56660',和你手动写固定值的效果一致。
方案2:格式字符串(更易读,适合复杂条件)
$lineuri = "56660" $filter = "lineuri -like '*{0}'" -f $lineuri Get-CsUser -Filter $filter
用PowerShell的格式运算符-f提前构建好过滤字符串,再传递给参数,逻辑更清晰,尤其适合多个变量组合的场景。
额外说明
你提到不想用Where-Object是完全正确的——Where会先从服务器拉取所有7000个用户数据到本地,再在客户端过滤,性能非常差;而-Filter是在服务器端(AD层面)直接过滤,只返回符合条件的结果,效率高得多,所以一定要坚持用-Filter的正确写法。
内容的提问来源于stack exchange,提问作者Graham J
相关产品推荐
相关产品推荐

