PowerShell中如何让Out-GridView返回变量仅传递实际值而非@{值}?
解决Out-GridView返回对象导致变量格式异常的问题
我来帮你搞定这个问题!你遇到的情况确实和Out-GridView的返回值特性有关——它返回的是对象而非纯文本字符串,这才导致变量传递时出现@{Name=目标值}的格式。你说用$ouname.name没生效,大概率是在拼接OU路径的时候语法有误,没让PowerShell正确解析属性。
问题根源
当你用Select Name后,管道传给Out-GridView的是带有Name属性的自定义对象,不是纯字符串。直接把这个对象放进字符串里(比如"OU=$OUname,OU=..."),PowerShell会自动把对象转换成它的字符串表示形式,也就是你看到的@{Name=xxx}。
两种解决方案
方案1:直接提取纯字符串(推荐)
在传给Out-GridView之前,用Select-Object -ExpandProperty Name把Name属性的值提取出来,这样$OUName变量里存的就是纯OU名称文本,后续直接用就不会有格式问题:
# 使用GUI提供OU列表供选择,直接提取Name属性为纯字符串 $OUName = Get-ADOrganizationalUnit -SearchBase "OU=Hosted Exchange Customers,DC=Domainname,DC=local" -Filter '*' | Select-Object -ExpandProperty Name | Sort-Object | Out-GridView -PassThru -Title 'Select the OU name to search'
方案2:保留对象,正确引用属性
如果你需要保留对象的其他属性,那在拼接OU路径时,要用**子表达式$()**确保PowerShell正确解析对象的Name属性,而不是把对象和.name拼接成字符串:
# 这里注意用$($OUName.Name)来正确引用属性 $EasMailboxes = Get-Mailbox -OrganizationalUnit "OU=$($OUName.Name),OU=Hosted Exchange Customers,DC=Domainname,DC=local" -ResultSize unlimited
修正后的完整代码(用方案1)
# 使用GUI提供OU列表供选择,直接提取Name属性为纯字符串 $OUName = Get-ADOrganizationalUnit -SearchBase "OU=Hosted Exchange Customers,DC=Domainname,DC=local" -Filter '*' | Select-Object -ExpandProperty Name | Sort-Object | Out-GridView -PassThru -Title 'Select the OU name to search' # 获取ActiveSync和邮箱数据 $AllEASDevices = @() $EASDevicesTemplate = "" | Select-Object 'User','PrimarySMTPAddress','DeviceType','DeviceModel','DeviceOS', 'LastSyncAttemptTime','LastSuccessSync' $EasMailboxes = Get-Mailbox -OrganizationalUnit "OU=$OUName,OU=Hosted Exchange Customers,DC=Domainname,DC=local" -ResultSize unlimited foreach ($EASUser in $EasMailboxes) { # 每次循环都创建新的对象,避免引用同一对象导致数据覆盖 $EASDevices = $EASDevicesTemplate.PSObject.Copy() $EASDevices.User = $EASUser.DisplayName $EASDevices.PrimarySMTPAddress = $EASUser.PrimarySMTPAddress.ToString() foreach ($EASUserDevices in Get-ActiveSyncDevice -Mailbox $EasUser.Alias) { $EASDeviceStatistics = $EASUserDevices | Get-ActiveSyncDeviceStatistics $EASDevices.DeviceType = $EASUserDevices.DeviceType $EASDevices.DeviceModel = $EASUserDevices.DeviceModel $EASDevices.DeviceOS = $EASUserDevices.DeviceOS $EASDevices.LastSyncAttemptTime = $EASDeviceStatistics.LastSyncAttemptTime $EASDevices.LastSuccessSync = $EASDeviceStatistics.LastSuccessSync $AllEASDevices += $EASDevices | Select-Object User,PrimarySMTPAddress,DeviceType,DeviceModel,DeviceOS,LastSyncAttemptTime,LastSuccessSync } } $AllEASDevices = $AllEASDevices | Sort-Object User $AllEASDevices # 这里补充$fname的定义,比如: # $fname = "C:\Path\To\Your\EAS_Devices.csv" # $AllEASDevices | Export-Csv -Path $fname -NoTypeInformation
另外提个小建议:你原来的代码里重复使用同一个$EASDevices对象,会导致$AllEASDevices里的所有条目都是最后一条数据的副本,我在修正后的代码里改成了每次循环复制模板对象,避免这个问题。
内容的提问来源于stack exchange,提问作者Tekwhat
相关产品推荐
相关产品推荐

