windows PS -迭代字符串数组以检测孤立的用户目录

ssgvzors  于 2023-10-22  发布在  Windows
关注(0)|答案(1)|浏览(119)

我们有一个问题,即通过intune的标准windows配置文件删除方法无法正常工作,通常会在C\Users中留下孤立的用户目录,这会使C:驱动
我想写一个PS脚本:

  • 获取用户配置文件(普通用户)
  • 获取C:\Users中的(普通)用户目录
  • 确定哪些目录不对应于用户配置文件
  • 删除这些目录

我是PS新手)

# Get user directories
[string[]]$Directories = Get-ChildItem C:\users | 
       Where-Object {$_.PSIsContainer -and $_ -notlike "*Windows*" -and $_ -notlike "*default*" -and $_ -notlike "*Public*" -and $_ -notlike "*Admin*"} | 
       Foreach-Object {$_.Name}    

# Get user profiles
[string[]]$Profiles = Get-CimInstance -ClassName Win32_UserProfile -Filter "Special = 'False'" | Select-Object LocalPath | Out-String

#Iterate
Foreach($Directory in $Directories) {
    
    if(("C:\users\" + $Directory) -notin $Profiles){
        ## complete some task
    }

}

我发现我错过了一些基本的东西。的迭代。如果我注解掉if循环add write-host $Directory,它将列出目录,但只有第一个目录前面有C:\Users\。
我还假设我构造的数组不正确,尽管它们看起来是字符串数组?
如果工作正常,在C:\Users\中创建一个空文件夹“Test”,并在if循环中添加write-host $Directory,应该只会输出“Test”。
提前感谢:)

h7appiyu

h7appiyu1#

PowerShell作为一种语言,与许多语言不同,它是一种动态类型语言。也就是说,不需要为返回的输出进行 * 类型转换 在大多数情况下 *)。
也就是说,当你可以直接使用属性时,你也不必对它的任何输出进行字符串化(via Out-String):

$users_folders = (Get-ChildItem -Path 'C:\Users' -Exclude 'Admin', 'Public' -Directory).FullName
$profile_paths = (Get-CimInstance -ClassName 'Win32_UserProfile' -Filter "Special = 'False'").LocalPath
foreach ($folder in $users_folders)
{
    if ($folder -notin $profile_paths)
    {
        $folder
    }
}

你必须注意 grouping 操作符(...),当它应用于集合时,它允许直接访问集合中项目的属性。如果您有一个对象数组,并且使用分组运算符后跟属性名称(如LocalPathFullName),PowerShell将为集合中的每个对象返回该属性的值。也称为Member-Access Enumeration

相关问题