如何使用通配符过滤 ProfileList

How to filter ProfileList with wildcards

我正在编写一个脚本来帮助简化 Citrix 服务器上用户配置文件列表的删除。我不知道如何通过通配符过滤 ProfileImagePath。

在我们的 Windows 2008 服务器的 Regedit 中,我可以通过其 Profileimagepath 搜索和排序用户的配置文件列表,但这会吸引所有用户,我似乎无法扩展该过滤器以仅带回通配符条目。

set-location | 'HKLM:\SOFTWARE\Microsoft\Windows 
NT\CurrentVersion\ProfileList' |% {Get-ItemProperty $_.pspath } | Select 
profileImagePath=username*

我得到的是整个用户配置文件列表,或者如果我输入过滤器 =username* 条目,我会得到一个错误,我想要得到的只是通配符的结果,理想情况下只是我的用户名放在通配符中的是我想要返回的内容。

您发布的代码已完全损坏。请先查找 PowerShell 教程,然后再继续。

  • Set-Location 不产生输出,即使产生输出,将 cmdlet 输出通过管道传输到字符串中也不会做任何事情。
  • 您不能像在示例代码中那样在任意位置包装语句。
    • 包装的注册表路径字符串将保留嵌入的换行符(因此不匹配您希望它匹配的内容)。
    • Select-Object 语句的参数放在下一行而不转义换行符将 运行 Select-Object 没有参数并将参数作为单独的语句(这很可能会抛出一个错误,因为参数本身不是有效的语句)。
  • = 是 PowerShell 中的 assignment 运算符。 比较运算符是-eq(相等)、-like(通配符匹配)和-match(正则表达式匹配)。
  • 您需要 Where-Object 来过滤流水线对象,而不是 Select-Object。后者用于选择对象 properties.

您可能打算做这样的事情:

$username    = '...'
$profilePath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'

Get-ChildItem $profilePath | Where-Object {
    (Get-ItemProperty $_.PSPath).ProfileImagePath -like "*${username}*"
}

或(更简单)像这样:

$username    = '...'
$profilePath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'

Get-ChildItem $profilePath |
    Get-ItemProperty |
    Where-Object { $_.ProfileImagePath -like "*${username}*" }