如何为Azure AD查询给CSV导入的组名添加单引号并展开属性
问题场景
我正在使用Azure AD,已导入包含组名的CSV文件,需要为这些组的name属性添加单引号以用于Azure AD查询,但遇到格式错误。
CSV文件内容(myfile.csv)
name Group Mémos - 1 Group Mémos - 2
尝试的脚本及问题
我最初用以下脚本:
$group = import-csv c:\temp\myfile.csv foreach ($item in $group) { Get-AzureADGroup -Filter "DisplayName eq $('$item.name')" | select ObjectId }
执行后得到的是'@{Name=Group Mémos - 1}.name',但实际需要的是'Group Mémos - 1'。目前只能通过临时变量作为 workaround:
$item2 = $item.Name Get-AzureADGroup -Filter "DisplayName eq $('$item2')" | select ObjectId
想知道如何直接展开name属性并添加单引号?
解决方法
有几种方式可以直接在字符串中正确展开对象属性并添加单引号:
方法1:使用子表达式$()
在双引号字符串中,用$()包裹属性访问表达式,就能正确解析属性值:
$group = Import-Csv c:\temp\myfile.csv foreach ($item in $group) { Get-AzureADGroup -Filter "DisplayName eq '$($item.Name)'" | Select-Object ObjectId }
这里'$($item.Name)'会先执行$item.Name拿到属性值,再把值用单引号包裹,最终生成符合要求的筛选字符串。
方法2:使用字符串格式化
用-f运算符来构造筛选字符串,可读性更强:
$group = Import-Csv c:\temp\myfile.csv foreach ($item in $group) { $filter = "DisplayName eq '{0}'" -f $item.Name Get-AzureADGroup -Filter $filter | Select-Object ObjectId }
{0}会被$item.Name的值替换,自动完成单引号的包裹。
方法3:使用PowerShell的引号嵌套特性
也可以用单引号+双引号的组合来实现(Azure AD筛选器支持双引号包裹值):
$group = Import-Csv c:\temp\myfile.csv foreach ($item in $group) { Get-AzureADGroup -Filter 'DisplayName eq "' + $item.Name + '"' | Select-Object ObjectId }
这种方式通过字符串拼接,把属性值用双引号包裹,同样能满足查询需求。
内容的提问来源于stack exchange,提问作者Cividan
相关产品推荐
相关产品推荐

