我试图从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
)提供属性路径-参见此答案。