Преобразовать формат даты в именах файлов в гггг-мм-дд (формат ISO) - в настоящее время в нескольких других форматах, включая гггг.мм.дд, мм.дд.гггг и мм-дд-гггг - PullRequest
0 голосов
/ 25 сентября 2018

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

Я ищу использовать powershell для просмотра и обновления их до правильной даты.формат (дата ISO).

Это то, что я выяснил до сих пор (для переключения yyyy.mm.dd на yyyy-mm-dd), но это не совсем правильно:

Get-ChildItem -File -Recurse | % { Rename-Item -Path $_.PSPath -NewName $_.Name.replace("201[0-9]\.[0-9][0-9]\.[ -~].","201[0-9]-[0-9][0-9]-[ -~].")}

Следующий скрипт успешно заменяет точки на тире, но он меняет все точки на тире, и я хочу быть осторожным, чтобы не менять любые точки после 10-го символа и только в файлах, которые соответствуют указанному форматированию (например, 201 [0-9]. [0-9] [0-9]. [0-9] [0-9]).

Get-ChildItem -Path $_.PSPath -Filter "*.pdf" | Rename-Item -NewName { $_.BaseName.Replace(".","-") + $_.Extension }

Я знаю, что подхожу к этому первому, ноЯ не совсем там.У кого-нибудь есть предложения по внесению изменений в него?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Еще один способ сделать это с помощью регулярного выражения.Если вы уверены, что файлы будут переименованы правильно, удалите -WhatIf из командлета Rename-Item.

Get-ChildItem -Path . -File |
    ForEach-Object {
        if ($_.Name -match '(.*)(\d{4})\.(\d{2})\.(\d{2})(.*)') {
            Rename-Item -Path $_.FullName -NewName $($_.Name -replace '(.*)(\d{4})\.(\d{2})\.(\d{2})(.*)','$1$2-$3-$4$5') -Whatif
        }
    }
0 голосов
/ 25 сентября 2018

При работе с датами я предлагаю разбирать их на объекты datetime, чтобы вы могли воспользоваться встроенными функциями.

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

Вы также можете использовать -WhatIf, чтобы подтвердить, что элемент переименования работает правильно.

Get-ChildItem -path $path -recurse -include *.pdf | Where-Object BaseName -match ".*[\d\.\-]{10}$" | Foreach-Object { 
    $null = $PSItem.BaseName -match "(.*)([\d\.\-]{10})$"
    Switch -regex ($matches[2]){
        "\d{4}\-\d{2}\-\d{2}" {$date = [datetime]::ParseExact($matches[2],"yyyy-dd-MM",$null)}
        "\d{2}\.\d{2}\.\d{4}" {$date = [datetime]::ParseExact($matches[2],"MM.dd.yyyy",$null)}
        "\d{4}\.\d{2}\.\d{2}" {$date = [datetime]::ParseExact($matches[2],"yyyy.dd.MM",$null)}
    }

    $PSItem | rename-Item -NewName "$(Matches[1]).($date.ToString("yyyy-MM-dd")$($PSItem.Extenstion))"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...