2
votes

Renommer les fichiers en reformatant la chaîne de date intégrée dans leurs noms

J'utilise Powershell de Windows dans le CMD pour supprimer 'Mon, tue, wed' etc. de mes noms de fichiers, ce qui fonctionne parfaitement

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 ", "") }

Maintenant, mes noms de fichiers ressemblent à ceci: 13 juillet 2018 - Lorem ipsum

Je voudrais changer le jour avec le mois, donc ce sera: 13 juillet 2018, donc je pourrais le trier par mois. Ou peut-être même le 13 juillet 2018.

Comment pourrais-je faire cela?

Merci, Mike


2 commentaires

Pourquoi ne pas analyser la date et la réémettre au format AAAA-MM-JJ? Les mois en tant que noms ne seront pas (utilement) triables.


Eh bien, ce sont des fichiers téléchargés à partir de l'interwebz, qui ont la date de l'article de blog dans le nom de fichier. Je voudrais donc rester simple et changer simplement les mois et les années, etc. Je peux donc les trier facilement dans mon dossier.


4 Réponses :


0
votes

Vous pouvez enchaîner les remplacements pour chaque mois et terminer par une instruction replace pour changer les nombres comme celui-ci

2018 07 13 - Lorem ipsum

qui renvoie

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

p >


0 commentaires

0
votes

Vous pouvez utiliser le code suivant pour convertir la date

2018 July 13 -  Lorem ipsum

Cela affichera

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


0 commentaires

2
votes

Vous pouvez combiner les deux transformations souhaitées en une opération unique en utilisant Rename-Item avec un bloc de script delay-bind dans lequel L'opérateur -replace vous permet de transformer le nom du fichier selon vos besoins en fonction d'une regex (expression régulière).

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

-WhatIf prévisualise l'opération de changement de nom; supprimez-le pour effectuer un changement de nom réel.

Un fichier d'entrée nommé Mon 13 juillet 2018 - Lorem ipsum , par exemple, serait renommé
13 juillet 2018 - Lorem ipsum .

Remarque: Cet exemple de nom de fichier n'a pas d'extension de nom de fichier, mais les solutions ci-dessus et ci-dessous fonctionnent également avec des noms de fichiers qui ont des extensions .

Pour plus d'informations sur l'opérateur -replace de PowerShell, consultez ce réponse .


Si vous vouliez rendre vos noms de fichiers vraiment triables en utilisant un format intégré tel que 2018-07-13 pour représentent le 13 juillet 2018 , plus de travail est nécessaire, via le -split operator :

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

Un fichier d'entrée nommé Mon 13 juillet 2018 - Lorem ipsum , par exemple, serait re nommé en
2018-07-13 - Lorem ipsum .

Pour plus d'informations sur l'opérateur -split de PowerShell, voir cette réponse .
L'affectation à plusieurs variables ( $ null, $ date, $ rest = ... ) est expliquée dans la rubrique d'aide about_Assignment_Operators

p>


0 commentaires

1
votes

Ce n'est pas une réponse à votre question, c'est la réponse de IMO mklement0 qui sert le mieux.

Mais un remplacement pour votre laid exemple de code sous-optimal.

L'opérateur -replace basé sur RegEx est supérieur à la méthode .replace ()
lorsque vous avez des alternatives à remplacer.

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

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

renvoie les noms de jour abrégés pour les paramètres régionaux actuels, qui peuvent être combinés
dans un RegEx "(Sun | Mon | Tue | Wed | Thu | Fri | Sat)" avec le code

[Globalization.DatetimeFormatInfo]::CurrentInfo.AbbreviatedDayNames

Une chaîne de remplacement vide ne 'pas besoin d'être exprimé avec l'opérateur -replace.

Si la sortie semble correcte, supprimez le -WhatIf de fin


0 commentaires