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
4 Réponses :
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 >
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])"
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>
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
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.