使用Get-ChildItem排除用户配置文件:变量传参失效求助
我之前也踩过这个坑!问题核心在于你从AD安全组获取的$ListOfUsers大概率不是纯用户名字符串数组,而是AD用户对象的集合。-Exclude参数需要的是能匹配文件夹名称的字符串,不是对象,所以直接用对象数组自然失效,而明文写的用户名是字符串,所以能正常工作。
问题根源
当你用Get-ADGroupMember这类命令获取AD组成员时,返回的是包含CN、SamAccountName等属性的AD对象。如果直接把这些对象存到$ListOfUsers里,PowerShell执行-Exclude时会把每个对象转换成它的默认字符串形式(比如CN=Bob Smith,OU=Users,DC=domain,DC=com),这显然和C:\Users下的文件夹名(比如BobSmith)不匹配,导致排除规则不起作用。
解决步骤
提取纯用户名字符串
从AD组获取用户时,要专门提取和Users目录文件夹名对应的属性(通常是登录名SamAccountName),用Select-Object -ExpandProperty把属性值转换成纯字符串数组:# 替换成你的AD安全组名称,同时过滤掉组内的嵌套组,只保留用户对象 $ListOfUsers = Get-ADGroupMember "你的排除用户组名" | Where-Object {$_.ObjectClass -eq "user"} | Select-Object -ExpandProperty SamAccountName验证变量类型
执行下面的命令确认$ListOfUsers是字符串数组:$ListOfUsers.GetType()输出应该显示为
System.String[],而不是AD对象的类型(比如Microsoft.ActiveDirectory.Management.ADPrincipal)。测试排除效果
现在再执行你的Get-ChildItem命令:Get-ChildItem "\\$computer\c$\Users" -Exclude $ListOfUsers就能正确排除指定的用户配置文件文件夹了。
额外提醒
如果你的Users目录里的文件夹名不是用SamAccountName(比如用用户全名),那就要把上面的SamAccountName换成对应的属性(比如DisplayName),确保提取的字符串和文件夹名完全匹配。
内容的提问来源于stack exchange,提问作者Joe Clough

