powershell 从子对象中选择项目

l7mqbcuq  于 2023-04-30  发布在  Shell
关注(0)|答案(2)|浏览(126)

我正在尝试从Get-AppxPackage获取用户名。不幸的是,该属性嵌套得很深。在我的脑海里,它会是这样的(但它不起作用):

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

在用户名中,可能有1个或2个项目,具体取决于软件包。如果有两个项目,我想把一个不像'defaultuser*'到一个变量作为一个字符串。

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

应该返回一些内置到Windows 10中的具有多个UserName项的示例包。

of1yzvn4

of1yzvn41#

首先过滤对象,然后选择并输出结果-您可以使用计算的属性结构选择“嵌套”属性:

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

现在,所有的包和用户都在一个对象中,这个对象不包括defaultuser* From $PackagesAndUsers-您可以从中选择任何您喜欢的内容来填充字符串。
请记住,如果您的计算机上有多个用户,用户名字段中仍可能有多个用户

afdcj2ne

afdcj2ne2#

  • 下面从已在本地计算机上安装了所有AppX包的用户中提取不以defaultuser开头的用户名。
  • 考虑到可能有许多重复项,可以考虑通过管道连接到Sort-Object -Unique,以获得唯一的用户名结果集。
Get-AppxPackage -AllUsers |
  ForEach-Object {
    @($_.PackageUserInformation.UserSecurityID.Username) -notlike 'defaultuser*'
  }

注意@(…),数组子表达式运算符的使用,它确保LHS是一个 array
使用 * 集合 *(例如数组)作为LHS,PowerShell比较运算符(例如-notlike)充当 * 过滤器 * 并返回匹配项的 * 数组 * 而不是布尔值-请参阅about_Comparison_Operators。
因此,上面的代码只是从$_.PackageUserInformation.UserSecurityID.Username报告的(潜在的)用户名数组中 * 过滤掉 * 以defaultuser开头的用户名
至于你尝试了什么
... | select $_.PackageUserInformation.UserSecurityID.Username

  • $_只在 script blocks{ ... })中有意义地定义-参见this answer
  • 即使没有它,您也不能向Select-Object(其内置别名为select)提供属性 paths-请参阅this answer

相关问题