2016-09-26 1 views
1

J'ai regardé partout sur stackoverflow et d'autres forums en ligne pour toute aide sur les variables PowerShell et la fonction de renommer. Je n'ai pas eu de chance.Comment réorganiser le format de la date dans le nom de fichier

La convention de nom de fichier que j'utilise est: CompanyName 12.31.15 FS (Le "FS" décrit le contenu du fichier, dans ce cas les états financiers). Les mois à un chiffre sont précédés de trois espaces, de sorte que le «FS» se retrouve toujours dans la même colonne dans l'explorateur Windows.

Le format de date est m.dd.yy, bien que je souhaite le remplacer par yy. mm.dd. Le problème est que j'ai plus de 30 dossiers avec une myriade de fichiers - Certains ne suivent pas cette convention de nommage de fichiers mais s'ils utilisent le format m.dd.yy, alors le nom de fichier suit certainement la convention.

Alors, voici ce que je cherche:

  • Une façon de changer autour seule la partie date du nom de fichier de m.dd.yy à AA.MM.JJ

  • Ce faisant, pour supprimer également 2 des espaces principaux (où il y a actuellement 3) et seulement avoir un espace entre CompanyName, date et contenu.

  • Les fichiers doivent être modifiés dans plusieurs répertoires dans les "entreprises" dossier


Exemples:

Actuellement:

CocaCola 12.31.15 FS 

CocaCola 6.30.15 FS 

Je veux:

CocaCola 15.12.31 FS 

CocaCola 15.06.31 FS 

Répondre

1

Récupérez les fichiers à l'aide de la cmdlet Get-ChildItem. Renommez-le en utilisant Rename-Item. Pour changer la date, vous pouvez l'analyser et la formater à la sortie désirée. Cependant, vous pouvez également faire tout en utilisant un regex:

$yourCompanyPath = 'C:\tmp' 

$callback = { 
    param($match) 

    '{0} {1}.{2:D2}.{3} {4}' -f $match.Groups["CompanyName"].Value, 
     $match.Groups["Year"].Value, 
     [int]$match.Groups["Month"].Value, 
     $match.Groups["Day"].Value, 
     $match.Groups["FS"].Value 
} 

$rex = [regex]'(?<CompanyName>\S+)\s+(?<Month>\d+)\.(?<Day>\d+)\.(?<Year>\d+)\s+(?<FS>FS)' 

Get-ChildItem $yourCompanyPath | Foreach { 
    $_ | Rename-Item -NewName ('{0}{1}' -f $rex.Replace($_.BaseName, $callback), $_.Extension) 
} 

Exemple de source:

CocaCola 6.30.15 FS.csv 
CocaCola 12.31.15 FS.csv 

Sortie:

CocaCola 15.06.30 FS.csv 
CocaCola 15.12.31 FS.csv 
+0

J'ai testé votre script deux fois. Il semble fonctionner sur l'exemple source mais cela n'a pas fonctionné quand je l'ai essayé sur un dossier: Il n'a rien fait pour les noms de fichiers avec les 3 espaces principaux. On dirait qu'il a traversé les autres dates quelques fois de plus car le format a fini par être jour, année, mois. Il se peut que j'ai oublié de mentionner que la partie "FS" peut être plus qu'un simple mot, elle peut contenir quelques mots de plus délimités par des espaces avant le .filetype. – LordBalogh

+0

Que voulez-vous me dire? J'ai répondu à votre question puisque la question portait sur les fichiers, * pas * les dossiers. –

+0

Je suppose que deux choses: Je veux que cela fonctionne sur les noms de fichiers individuels, même s'ils sont imbriqués dans des dossiers et que votre script ne fonctionne pas (même sur le contenu d'un seul dossier). On dirait qu'il a fait une boucle sur les noms de fichiers trop de fois. – LordBalogh