Вопрос или проблема
Это не работает для меня, почему? Какой здесь правильный разделитель?
Идея взята из этого вопроса:
Как мне сделать так, чтобы 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 дней будут удалены.
Нет файлов для удаления!
Конец скрипта
Несколько вещей, которые нужно исправить.
- Параметр
-Include
требует, чтобы вы также использовали параметр-Path
.
ИзGet-Help Get-ChildItem -full
,
“Значение этого параметра уточняет параметр Path. Введите элемент пути или шаблон, такой как ‘*.txt’. Шаблоны с подстановочными знаками разрешены.”
$Cache
должен заканчиваться звездочкой. Более подробно изGet-Help Get-ChildItem -full
,
“Параметр Include эффективен только тогда, когда команда включает параметр
Recurse или путь ведет к содержимому директории,
такой как C:\Windows*, где символ подстановки указывает на
содержимое директории C:\Windows.”
- Вам не нужны скобки или одинарные кавычки вокруг этих расширений, так как они не содержат пробелов или специальных символов.
Ваши изменения должны быть такими,
$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 дней. Убедитесь, что вы тестируете скрипт в безопасной среде перед его применением на реальных данных, чтобы избежать случайной потери информации.