Переименуйте файлы, переформатировав строку даты, встроенную в их имена - PullRequest
2 голосов
/ 15 марта 2019

Я использую Windows 'Powershell в CMD, чтобы удалить' Mon, Tue, Wed 'и т. Д. Из моих имен файлов, который отлично работает

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Mon ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Tue ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Wed ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Thur ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Fri ", "") }
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace("Sat ", "") }

Теперь имена моих файлов выглядят так: 13 июля 2018 года - Lorem ipsum

Я бы хотел поменять день на месяц, так что это будет: 13 июля 2018 года, чтобы я мог отсортировать его по месяцам. Или, может быть, даже 2018 13 июля.

Как я мог это сделать?

Спасибо, Mike

Ответы [ 4 ]

2 голосов
/ 15 марта 2019

Вы можете объединить оба желаемых преобразования в одну операцию , используя Rename-Item с блоком сценария привязки с задержкой , в котором -replace operator позволяет преобразовывать имя файла по необходимости на основе регулярного выражения (регулярное выражение).

Get-ChildItem -Recurse -Name | Rename-Item -NewName {
  $_.Name -replace '\w+ (\d+) (\w+) (\d+)', '$3 $2 $1'
} -WhatIf

-WhatIf превью операция переименования;удалите его для фактического переименования.

Например, входной файл с именем Mon 13 July 2018 - Lorem ipsum будет переименован в
2018 July 13 - Lorem ipsum.

Примечание.имя файла с примером не имеет расширения имени файла, но оба решения, приведенные выше и ниже, одинаково работают с именами файлов, которые имеют расширения.

Для получения дополнительной информации об операторе PowerShell -replace см. этот ответ .


Если вы хотите сделать ваши имена файлов действительно сортируемыми , используя встроенный формат, такой как 2018-07-13, для представления 13 July 2018, требуется дополнительная работа черезоператор -split :

Get-ChildItem -Recurse -Name | Rename-Item -NewName {
  # Split the name into the date part (ignoring the weekday) and the
  # rest of the file name.
  $null, $date, $rest = $_.Name -split '\w+ (\d+ \w+ \d+)'
  # Convert the date string to [datetime] instance, reformat it, and
  # append the rest.
  ([datetime] $date).ToString('yyyy-MM-dd') + $rest
} -WhatIf

Например, входной файл с именем Mon 13 July 2018 - Lorem ipsum будет переименован в
2018-07-13 - Lorem ipsum.

ДляПодробнее об операторе PowerShell -split см. этот ответ .
Назначение нескольких переменных ($null, $date, $rest = ...) объясняется в разделе справки about_Assignment_Operators

1 голос
/ 15 марта 2019

Не ответ на ваш вопрос, лучше всего ответ IMO mklement0.

Но замена для вашего некрасивого неоптимального примера кода.

Оператор -replace на основе RegEx превосходит метод .replace ()
при наличии замен для замены.

[Globalization.DatetimeFormatInfo]::CurrentInfo.AbbreviatedDayNames

возвращает сокращенные названия дней для текущей локали, которые можно комбинировать
в одном RegEx "(Sun|Mon|Tue|Wed|Thu|Fri|Sat) " с кодом

$RE=[regex]"("+([Globalization.DatetimeFormatInfo]::CurrentInfo.AbbreviatedDayNames -join '|')+") "

Get-ChildItem -recurse -File | Rename-Item -NewName {$_.Name -replace $RE} -WhatIf

Пустую строку замены не нужно выражать с помощью оператора -replace.

Если выходные данные выглядят нормально, удалите завершающий -WhatIf

0 голосов
/ 15 марта 2019

Вы можете использовать следующий код для преобразования даты

$string = '13 July 2018 - Lorem ipsum'
$dateObject = [datetime]$string.Split('-')[0]
Write-Output "$($dateObject.ToString('yyyy MMMM dd')) - $($array[1])"

Это выдаст

2018 July 13 -  Lorem ipsum
0 голосов
/ 15 марта 2019

Вы можете объединять замены для каждого месяца и заканчивать оператором замены для переключения чисел, подобных этой

"13 July 2018 - Lorem ipsum" `
    -replace 'July', '07' `
    -replace 'Aug', '08' `
    -replace "(\d+) (\d+) (\d+)", '$3 $2 $1'

, которая возвращает

2018 07 13 - Lorem ipsum
...