PowerShell с использованием CSV для удаления файлов - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь очистить файлы голосовой почты в различных пользовательских каталогах, которые старше 30 дней. Я хочу использовать CSV, чтобы определить, с какими пользователями запускать скрипт.

$csv = Import-Csv "\\Server\Name\User_Base_test.csv"

foreach ($user in $csv) {
    Get-ChildItem "C:\Users\$user\AppData\Roaming\Zultys\MX Settings\$user.vm\Voice Messages\Deleted\" -Recurse |
        Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-30))} |
        Remove-Item
}

Когда я запускаю его, я получаю следующую ошибку

Get-ChildItem: Не удается найтипуть 'C: \ Users @ {USER = jdough} \ AppData \ Roaming \ Zultys \ MX Settings @ {USER = jdough} .vm \ Голосовые сообщения \ удален \', поскольку он не существует.

В C: \ Users \ jasonm \ Desktop \ VM_SCRIPT \ Clear_Old_Deleted_VM.ps1: 3 символа: 5

  • Get-ChildItem "C: \ Users \ $ user \ AppData \ Roaming \ Zultys \ MX Settings \ $ user.vm \ Vo ...
   + CategoryInfo          : ObjectNotFound: (C:\Users\@{USER...oice Messages\D:String) [Get-ChildItem], ItemNotFoundException
   + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Файл CSV содержит одну строку для чтения jdough, один из наших тестовых пользователей.

Я подтвердил разрешенияи что местоположение существует. Есть идеи, что мне не хватает?

1 Ответ

0 голосов
/ 10 октября 2019

Читая, что вы получаете в сообщении об ошибке, я думаю, что ваш CSV-файл - правильный csv с заголовками, и поле, которое вы ищете, - это имя пользователя SamAccountName, указанное в заголовке USER. Примерно так:

"USER","MaybeThereIsMoreInfo"
"jdough","Nothing worth mentioning here"
"huzzle","Interesting info"

Если изменить верхнюю строку вашего кода на

$csv = Import-Csv "\\Server\Name\User_Base_test.csv" | Select-Object -ExpandProperty USER

, вы получите $csv переменную, содержащую строковый массив только пользователя SamAccountNames вместо объектовсо свойством USER.

Что касается остальной части кода, вы, вероятно, захотите проверить файлы на наличие LastWriteTime старше 30 дней (полуночи) назад, поэтому я бы посоветовал создать ссылкупоставьте дату над циклом foreach и сравните с этим вместо того, чтобы вычислять это для каждого файла снова и снова:

# test for files older than 30 days midnight
$refDate = (Get-Date).AddDays(-30).Date

foreach ($user in $csv) {
    Get-ChildItem "C:\Users\$user\AppData\Roaming\Zultys\MX Settings\$user.vm\Voice Messages\Deleted" -File -Recurse |
        Where-Object {($_.LastWriteTime -lt $refDate)} |
        Remove-Item -WhatIf
}

Как вы можете видеть, я добавил переключатель -File к Get-ChildItem Командлет, чтобы функция возвращала только объекты FileInfo, а не DirectoryInfo.

A также добавил переключатель -WhatIf к окончательному Remove-Item, чтобы вы могли сначала протестировать и, если вас устраивает информация, отображаемая в WhatIf. консоли, удалите этот переключатель, чтобы фактически начать удаление файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...