此功能:
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
网格显示的信息不正确,如果运行没有功能的代码,网格显示的信息正确。
请任何建议,提前谢谢。
请注意类似:
# 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]
转换为字符串会产生 空字符串(
''
)由于表达式的结果既不会被捕获、发送到另一个命令,也不会被重定向 - 它会隐式发送到成功的参数,这解释了您看到的
Out-GridView
行为。
解决方案就是简单地省略这些表达式。 您稍后将使用以下赋值语句隐式创建变量:
$domain, $username = $LoginName.Split('\')
假设
.Split()
方法返回一个
[string]
元素数组,并且假设您使用 多重赋值将两个结果元素分配给各个变量,这些变量实际上将是
[string]
类型的,鉴于非类型约束变量按原样存储分配给它的任何对象。在这种情况下,您可以使用类型约束:
[string] $domain, [string] $username = $LoginName.Split('\')
但是没有真正的好处,除非您出于概念原因想要显式表示数据类型,或者您需要确保稍后分配给相同变量时使用的值变成
[string]
,即使这些值是不同类型。
顺便说一句:PowerShell 中变量赋值的另一个令人惊讶的方面是,它们隐式创建具有给定名称的