Сценарий оболочки WindowsPower не работает должным образом - PullRequest
0 голосов
/ 22 января 2019

Привет всем, у меня есть скрипт, который должен удалить файлы старше 90 дней. Выпуск без расчета времени для скрипта 90 дней работает нормально. Если мы добавим условие для проверки сроков, например: 90 дней не работает.

У меня есть специальная папка, которая содержит подпапки ниже сценария, не удаляя файлы в подпапке сценария, удаляя файлы только указанной папки, ее удаляя файлы подпапки.

у нас есть требование сценария оболочки Power, которыйследует удалить файлы старше 90 дней, и он также должен удалять файлы в подпапках.

Может ли кто-нибудь предложить какие-либо изменения, которые необходимо сделать для сценария ниже

Get-ChildItem -Path "D:\samples\" -Include *.* -Recurse -Force | where CreationTime -lt (Get-Date).AddDays(-10) | foreach {$_.Delete()}

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Использование нескольких тегов powershell (которые обычно исключают друг друга) неоднозначно,
если вы хотите убедиться, что скрипт работает под PSv2, используйте только этот тег.

Командлет Remove-Item напрямую принимает конвейерный ввод, поэтому я бы использовал его вместо ForEach-Object и метода объектов .delete().

Для параметра -File требуется PSv3 +, альтернатива - проверка (не = !) $_.PSIsContainer

Сценарий IMO проще для чтения разрывных строк, где PowerShell ожидает продолжения и отступа:

## Q:\Test\2019\01\22\SO_54311383.ps1
$BasePath = "D:\samples\*"
$Treshold = (Get-Date).Date.AddDays(-10)

Get-ChildItem -Path $BasePath -Recurse -Force |
    Where-Object {!$_.PSIsContainer -and
                  $_.CreationTime -lt $Treshold} |
        Remove-Item  -WhatIf # -Force

Если вывод выглядит нормально, удалите -WhatIf в последней строке.
В конечном итоге необходимый параметр -Force закомментирован на данный момент.

0 голосов
/ 22 января 2019

Вашему | where нужны фигурные скобки {}.На объект ссылается $_.Используя это, ваш код будет выглядеть так:

Get-ChildItem -Path "D:\samples\" -file -Recurse -Force | where {$_.CreationTime -lt (Get-Date).AddDays(-10)} | foreach {$_.Delete()}

Примечание: я заменил -Include "." на -file, чтобы включить все файлы.Это требует как минимум версии 3.0 powershell.Проверьте версию с $Host

...