Get-Childitem -Include разделитель массива

Вопрос или проблема

Это не работает для меня, почему? Какой здесь правильный разделитель?

Идея взята из этого вопроса:
Как мне сделать так, чтобы get-childitem фильтровал по нескольким типам файлов?

$Jetzt = Get-Date
$Alterung = "14"
$Cache = "D:\SCANS\"
$Aenderung = $Jetzt.AddDays(-$Alterung)
$Files = Get-Childitem $Cache -Force -Include ('*.docx', '*.pdf') | Where {$_.LastWriteTime -le "$Aenderung"}
""
"Все файлы старше $Alterung_DIR дней будут удалены."
""
foreach ($File in $Files)
{
    if ($File -ne $NULL)
    {
            "На $Jetzt УДАЛЕНО--> $File"
            Remove-Item $File.FullName -Force -recurse | out-NULL
    }
    else
    {
        "Нет файлов для удаления!"
    }
}

""
"Конец скрипта"

Вывод:

Все файлы старше 14 дней будут удалены.

Нет файлов для удаления!

Конец скрипта

Несколько вещей, которые нужно исправить.

  1. Параметр -Include требует, чтобы вы также использовали параметр -Path.
    Из Get-Help Get-ChildItem -full,

“Значение этого параметра уточняет параметр Path. Введите элемент пути или шаблон, такой как ‘*.txt’. Шаблоны с подстановочными знаками разрешены.”

  1. $Cache должен заканчиваться звездочкой. Более подробно из Get-Help Get-ChildItem -full,

“Параметр Include эффективен только тогда, когда команда включает параметр
Recurse или путь ведет к содержимому директории,
такой как C:\Windows*, где символ подстановки указывает на
содержимое директории C:\Windows.”

  1. Вам не нужны скобки или одинарные кавычки вокруг этих расширений, так как они не содержат пробелов или специальных символов.

Ваши изменения должны быть такими,

$Files = Get-Childitem -Path $Cache -Force -Include *.docx, *.pdf
$Cache = "D:\SCANS\*"
if ($File -ne $NULL) на if (!$File).

Ответ или решение

Ваша проблема с использованием команды Get-ChildItem в PowerShell на самом деле связана с неправильным использованием параметров команды. Давайте разберёмся с каждой из частей вашего скрипта и внесём необходимые изменения, чтобы он корректно работал.

1. Параметр -Include

В PowerShell, когда вы используете параметр -Include, вам обязательно нужно указывать также параметр -Path. Это значит, что команда Get-ChildItem требует указания пути, к которому будет применяться фильтрация. В вашем случае это $Cache. Ваша команда должна выглядеть следующим образом:

$Files = Get-ChildItem -Path $Cache -Force -Include *.docx, *.pdf

2. Использование символа подстановки

Также важно, чтобы путь к папке в переменной $Cache заканчивался символом *, что позволит команде рассмотреть содержимое этой папки. Обновите строку определения переменной $Cache:

$Cache = "D:\SCANS\*"

Теперь ваша команда будет правильно искать все файлы с расширениями .docx и .pdf внутри директории D:\SCANS.

3. Аргументы -Include

Когда вы используете массив для параметра -Include, для разделения элементов вам не нужны скобки или кавычки. Вы можете просто перечислить их через запятую, как в примере ниже:

$Files = Get-ChildItem -Path $Cache -Force -Include *.docx, *.pdf

4. Условие проверки файла

Вместо проверки на NULL, вы можете использовать упрощенную проверку:

if (!$File)

Это сделает ваш код более читаемым и понятным.

Полный исправленный скрипт

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

$Jetzt = Get-Date
$Alterung = 14
$Cache = "D:\SCANS\*"
$Aenderung = $Jetzt.AddDays(-$Alterung)

$Files = Get-ChildItem -Path $Cache -Force -Include *.docx, *.pdf | Where-Object { $_.LastWriteTime -le $Aenderung }

""
"Alle Dateien aelter als $Alterung Tage werden geloescht."
""

if ($Files) {
    foreach ($File in $Files) {
        "Am $Jetzt GELOESCHT --> $File"
        Remove-Item $File.FullName -Force -Recurse | Out-Null
    }
} else {
    "Keine Datei geloescht!"
}

""
"Skriptende"

Заключение

Сделав указанные изменения, вы сможете успешно отфильтровывать файлы по типам и удалять их, если они старше 14 дней. Убедитесь, что вы тестируете скрипт в безопасной среде перед его применением на реальных данных, чтобы избежать случайной потери информации.

Оцените материал
Добавить комментарий

Капча загружается...