从子对象中选择项

  • 本文关键字:选择 对象 powershell
  • 更新时间 :
  • 英文 :


我试图从get - appxpackage获得用户名。不幸的是,这个属性嵌套得非常深。在我的脑海中,它应该是这样的(但它不起作用):

Get-AppxPackage -Allusers | select $_.PackageUserInformation.UserSecurityID.Username | where-object {$_.PackageUserInformation.UserSecurityID.UserName -notlike "defaultuser*"}

在UserName中,根据包的不同,可以有1或2项。如果有2项,我想把不像'defaultuser*'的那一个作为字符串放入变量中。

Running Get-AppxPackage -Allusers | where-object {$_.PackageUserInformation.UserSecurityID.UserName -like "defaultuser*"} 

应该返回一些包含多个UserName项的示例包,这些项是内置在Windows 10中的。

首先筛选对象,然后选择并输出结果-您可以选择"nested"使用计算属性结构的属性:

$PackagesAndUsers = Get-AppxPackage -Allusers | Where-Object { $_.PackageUserInformation.UserSecurityID.UserName -notlike "defaultuser*"} | Select Name, @{N='UserName';E={$_.PackageUserInformation.UserSecurityID.UserName}}

现在您将所有的包和用户放在一个对象中,不包括defaultuser*$PackagesAndUsers-你可以从中选择任何你喜欢的东西来填充你的字符串。

请记住,如果您的计算机上有多个用户,则Username字段中仍可能有多个用户

  • 下面从本地机器上安装了所有AppX包的用户中提取不以defaultuser开头的用户名

  • 考虑到可能有许多重复的用户名,可以考虑通过管道连接到Sort-Object -Unique以获得唯一的用户名集。

Get-AppxPackage -AllUsers |
ForEach-Object {
@($_.PackageUserInformation.UserSecurityID.Username) -notlike 'defaultuser*'
}

注意使用了@(…),即数组子表达式操作符,它确保LHS是数组

使用集合(如数组)作为LHS, PowerShell比较操作符(如-notlike)充当过滤器并返回匹配项的数组,而不是布尔值—参见about_Comparison_Operators。因此,上面的简单地从$_.PackageUserInformation.UserSecurityID.Username

报告的(可能的)用户名数组中筛选出以defaultuser开头的用户名。

至于你试过的:

... | select $_.PackageUserInformation.UserSecurityID.Username

  • $_只在脚本块({ ... })中有意义地定义-参见此答案。

  • 即使没有它,您也不能为Select-Object(其内置别名是select)提供属性路径-参见此答案。

最新更新