如何使用通配符过滤ProfileList

时间:2018-12-31 10:48:21

标签: powershell regedit registrykey

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

在Regedit的Windows 2008服务器上,我可以搜索用户的配置文件列表并通过其Profileimagepath对其进行排序,但这可以吸引所有用户,我似乎无法扩展该过滤器,只返回通配符条目。

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

我得到的是用户配置文件的整个列表,或者如果我输入filter = username *条目,则会出现错误,我想要得到的只是通配符的结果,理想情况下只是我输入的用户名通配符是我想要返回的。

1 个答案:

答案 0 :(得分:0)

您发布的代码完全损坏。在继续进行任何操作之前,请先找到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}*" }