使用 Get-ChildItem -Exclude 排除文件夹

Excluding folders using Get-ChildItem -Exclude

我需要在使用 Get-ChildItem 时从 \Computer\c$\Users 文件夹中排除用户配置文件。

我可能需要从各种机器中排除 100 个配置文件,因此创建了一个变量,其中包含我想要排除的 AD 安全组中的所有用户配置文件,但是当我 运行 下面的命令不起作用时但如果我以纯文本形式列出配置文件,它确实有效。

Get-ChildItem "\$computer\c$\Users" -Exclude $ListOfUsers

但是如果我 运行 Get-ChildItem "\$computer\c$\Users" -Exclude Bob1,Bob2,Bob3,Bob4,Bob5

我从AD安全组中获取用户的代码如下,它输出的格式与上面的逗号相同。

## collects users from groups and adds to exlusion list.
stline =   Get-ADGroupMember GG_1st_Line_Team | Select SamAccountName
ndline =   Get-ADGroupMember GG_2nd_Line_Team | Select SamAccountName
rdline =   Get-ADGroupMember GG_3rd_Line_Team | Select SamAccountName
$FieldTech = Get-ADGroupMember  "Field tech" | select SamAccountname
$Excluded = stline + ndline + rdline + $Fieldtech | Out-File "C:\temp\Members.txt"
(get-content c:\temp\Members.txt) -join "," | out-file C:\temp\Format.txt
$format = get-content c:\temp\format.txt; $format = $format -replace '\s',''; $format = $format -replace ',SamAccountName,--------------,',''; $format = $format.trimend(",,") | Out-File "C:\temp\newFormat.txt"
$excluded = Get-Content C:\Temp\newFormat.txt

这将创建一个文本文件,其中包含 100 个名称,其中没有空格,仅以逗号分隔用户。如果我 Write-Host 变量 $newformat 逗号和文本一起是白色的,但是如果我将配置文件名称放在纯文本中,那么逗号是灰色的...

这里的问题似乎是您使用的 [string] 变量的值为 Tom,Dick,Harry.

我打赌你没有这样的文件夹,是吗?

虽然您可以将 [string] 传递给 -Exclude 参数;那将是一个单身人士(一个单一的标量值);最好的结果是 单一 排除。

你真正要传入的是一个字符串数组:[string[]]!

[string]$excludedString = "Tom,Dick,Harry"
[string[]]$excludedArray = $excludedString -split ","
Get-ChildItem -Path "C:\users" -Exclude $excludedArray

过度使用 Out-File 是不必要的,并且会导致您在将对象更改为字符串时出现问题。然后,您必须使用 SplitJoin 之类的命令将字符串转回您需要的对象(此处为数组)。

Out-File 只应在您实际需要将输出 作为文件.

时使用

只需对您的脚本进行一些简单的更改,它就会执行您想要的操作,而且会简单很多!


您可以使用 ExpandProperty 仅 return SamAccountName 本身的值作为字符串而不是对象。

然后您可以简单地创建这些字符串的数组,并使用它从 Get-ChildItem

中排除那些 accounts/folders
stline =   Get-ADGroupMember GG_1st_Line_Team | Select-Object -ExpandProperty SamAccountName
ndline =   Get-ADGroupMember GG_2nd_Line_Team | Select-Object -ExpandProperty SamAccountName
rdline =   Get-ADGroupMember GG_3rd_Line_Team | Select-Object -ExpandProperty SamAccountName
$FieldTech = Get-ADGroupMember  "Field tech" | Select-Object -ExpandProperty SamAccountname

$excluded = stline,ndline,rdline,$Fieldtech

Get-ChildItem "\$computer\c$\Users" -Exclude $excluded

然后您可以考虑使用 foreach 循环和 Get-ADGroupMember 来减少重复的 Get-ADGroupMember 代码。