You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:01:55