Powershell函数返回pscustomobject out-gridview显示不正确的结果

问题描述 投票:0回答:1

此功能:

function Get-UserNameSIDfromAD {
    param(
        [string] $LoginName
    )
    
    [string] $domain
    [string] $username

    $domain, $username = $LoginName.split('\')

    $w32usracc = Get-CimInstance -ClassName win32_useraccount -Filter "Name='$username' and Domain='$domain'" | Select-Object -Property SID

    $res = [pscustomobject] @{
        ID      = 1
        SqlSID  = $w32usracc.SID
        Message = 'OK'
    }

    return $res
}

#Using the function and get the result in variable and show using out-gridview
$val = Get-UserNameSIDfromAD -LoginName 'mydomain\user1'
$val | out-gridview 

在此输入图片描述

网格显示的信息不正确,如果运行没有功能的代码,网格显示的信息正确。

请任何建议,提前谢谢。

powershell function out-gridview
1个回答
0
投票

请注意类似:

# Does NOT declare a variable, outputs an empty string.
[string] $domain

不是变量声明

PowerShell 没有纯粹变量的概念声明(唯一的例外是参数变量 - 请参阅about_Functions

相关部分)。

您只能通过隐式创建变量通过为其赋值来“声明”变量。 (如果变量已经存在,则会更新。)

换句话说:

隐式创建变量赋值行为,无论LHS是否以类型文字为前缀,例如[string]

,它会放置
类型约束变量上的 (例如,[string] $domain = 42
 确保 RHS 是在分配时强制转换为字符串,无论是在初始分配期间还是后来的分配期间;也就是说,在本例中存储的值是 
'42'
)。
相比之下,

[string] $domain -

没有
赋值 - 是一个表达式,它产生隐式输出

在这种情况下,
    [string]
  • 充当应用于变量
    $domain
    的值的cast
    由于该变量尚不存在,因此替代值为 
  • $null
  • 。通过
    $null
    转换将
    [string]
    转换为字符串会产生
    空字符串
    ('')
    由于表达式的结果既不会被捕获、发送到另一个命令,也不会被重定向 - 它会隐式发送到成功
  • 输出流
  • 并成为函数输出的一部分(“返回值”)。
  • 由于您的函数中有两个这样的表达式,因此它的输出包含两个空字符串,后跟传递给

return

 的参数,这解释了您看到的 
Out-GridView 行为。

解决方案就是简单地

省略这些表达式 您稍后将使用以下赋值语句隐式创建变量:

$domain, $username = $LoginName.Split('\')

假设 
.Split()

方法返回一个

[string]
元素数组,并且假设您使用
多重赋值
将两个结果元素分配给各个变量,这些变量实际上将是 [string] 类型的,鉴于非类型约束变量按原样存储分配给它的任何对象。
在这种情况下,您

可以

使用类型约束: [string] $domain, [string] $username = $LoginName.Split('\')

但是没有真正的好处,除非您出于概念原因想要显式表示数据类型,或者您需要确保稍后分配给相同变量时使用的值变成 
[string]

,即使这些值是不同类型。

顺便说一句:

PowerShell 中变量赋值的另一个令人惊讶的方面是,它们隐式创建具有给定名称的
    local
  • 变量,即使该名称的变量已经存在,但是在祖先范围中定义的 - 请参阅这个答案
© www.soinside.com 2019 - 2024. All rights reserved.