Итак, глядя на сценарий, я решил изменить некоторые вещи до
Function Move-FilesByAge(){
param (
[Parameter(Mandatory=$true)][string]$Source,
[Parameter(Mandatory=$true)][string]$Destination,
[Parameter(Mandatory=$true)][timespan]$AgeLimit
)
Get-ChildItem $Source -Directory -Recurse | ?{
$($_.CreationTimeUtc.Add($AgeLimit)) -lt $((Get-Date).ToUniversalTime())
} | %{
$Dpath = $Destination + "\" + $_.CreationTimeUtc.ToString("yyyy") + "\" + $_.CreationTimeUtc.ToString("MMMM")
New-Item -ItemType Directory -Force -Path $Dpath
Move-Item $_ -Destination $Dpath -Force
}
}
Move-FilesByAge -Source C:\Test -Destination C:\Test2 -AgeLimit (New-TimeSpan -days 30)
Это может привести к серьезной проблеме. Если папка с таким именем существует, появится сообщение об ошибке:
Поскольку вы новичок в powershell, давайте рассмотрим некоторые основы этого скрипта. В Powershell нам нравится Piping |
, который вы хорошо сделали в оригинале. Мы также большой поклонник псевдонимов Where-Object ?{}
, Foreach-Object %{}
.
Get-ChildItem имеет встроенный переключатель для просто возврата каталогов -directory
.
Вы также используете последний LastWriteTime , когда вы должны использовать CreationTime . CreationTimeUtc позволяет стандартизировать ваше время по часовым поясам, предоставляя базовый часовой пояс.
Date.ToString (формат даты здесь). Это отличный способ сократить время разбора даты в виде строки. .ToString("yyyy")
получает год в 4 числах, например 2018. .ToString("MMMM")
получает месяц по названию, как март.