Как переместить папки из одного места в другое с помощью PowerShell - PullRequest
0 голосов
/ 12 ноября 2018

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

Скрипт для перемещения файлов

 param (
    [Parameter(Mandatory=$true)][string]$destinationRoot
 )

$path = (Get-Item -Path ".\").FullName

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }
Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} |
Foreach-Object {
    $content = $path + "\" + $_.Name

    $year = (Get-Item $content).LastWriteTime.year.ToString()
    $monthNumber = (Get-Item $content).LastWriteTime.month
    $month = (Get-Culture).DateTimeFormat.GetMonthName($monthNumber)

    $destination = $destinationRoot + "\" + $year + "\" + $month 

    New-Item -ItemType Directory -Force -Path $destination

    Move-Item -Path $content -Destination $destination -force

}

Часть Get-ChildItem, похоже, не вытягивает каталоги так, как должна.

1 Ответ

0 голосов
/ 12 ноября 2018

Итак, глядя на сценарий, я решил изменить некоторые вещи до

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") получает месяц по названию, как март.

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