Исключение папок с использованием Get-ChildItem -Exclude - PullRequest
0 голосов
/ 26 апреля 2018

Мне требуется исключить профили пользователей из папки \\Computer\c$\Users при использовании Get-ChildItem.

Мне потенциально нужно исключить 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.
$1stline =   Get-ADGroupMember GG_1st_Line_Team | Select SamAccountName
$2ndline =   Get-ADGroupMember GG_2nd_Line_Team | Select SamAccountName
$3rdline =   Get-ADGroupMember GG_3rd_Line_Team | Select SamAccountName
$FieldTech = Get-ADGroupMember  "Field tech" | select SamAccountname
$Excluded = $1stline + $2ndline + $3rdline + $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, то запятые вместе с текстом - белые, но если я поставлю имена профилей в виде обычного текста, запятые будут серыми ...

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Чрезмерное использование Out-File не является необходимым и вызовет проблемы, поскольку он превращает объекты в строки.Затем вам нужно использовать такие команды, как Split и Join, чтобы превратить строки обратно в нужный вам объект (массивы).

Out-File следует использовать только тогда, когда вам действительно нужен вывод в виде файла .

С несколькими простыми изменениями в вашем скрипте он будет делать то, что вы хотите, и будет намного проще!


Вы можете использовать ExpandProperty, чтобы вернуть только значение SamAccountName как строку, а не как объект.

Затем вы можете просто создать массив этих строк и использовать его для исключения этих учетных записей / папок из Get-ChildItem,

$1stline =   Get-ADGroupMember GG_1st_Line_Team | Select-Object -ExpandProperty SamAccountName
$2ndline =   Get-ADGroupMember GG_2nd_Line_Team | Select-Object -ExpandProperty SamAccountName
$3rdline =   Get-ADGroupMember GG_3rd_Line_Team | Select-Object -ExpandProperty SamAccountName
$FieldTech = Get-ADGroupMember  "Field tech" | Select-Object -ExpandProperty SamAccountname

$excluded = $1stline,$2ndline,$3rdline,$Fieldtech

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

Затем можно использовать цикл foreach с Get-ADGroupMember для сокращения дублированного кода Get-ADGroupMember.

0 голосов
/ 26 апреля 2018

Проблема здесь заключается в том, что вы используете переменную [string] со значением Tom,Dick,Harry.

Бьюсь об заклад, у вас нет таких папок, не так ли?

Tom,Dick,Harry Folder

Пока вы можете передать [string] в параметр -Exclude; это будет синглтон (одно скалярное значение); и лучшее, что вы получите, это одиночное исключение.

Что вы действительно хотите передать - это строковый массив: [string[]]!

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