2011-01-25 5 views
2

J'ai un grand répertoire de fichiers, dont beaucoup (mais pas tous) ont été sauvegardés en place en les copiant et en insérant .backup entre leur nom de fichier et leur extension. En utilisant PowerShell je voudrais créer une autre sauvegarde seulement des fichiers qui ont déjà été sauvegardés une fois, cette fois marqués avec .backup. (Date).Renommage de fichiers sélectif dans Powershell

Je suis encore très nouveau à powershell donc je suis un peu fragile les bases. Dans ce cas, le problème que je n'arrive pas à résoudre est de savoir comment sélectionner les fichiers pour lesquels il existe un nom de fichier identique avec .backup. Obtenir les fichiers .backup que je peux faire, mais ensuite obtenir leurs contreparties .backup-less et les passer à la pipe je ne peux pas encore faire. Essentiellement je suppose que je suis curieux de savoir s'il existe un opérateur Exists pour une utilisation dans where-object ou quelque chose.

Des idées?

Répondre

3

Cela devrait vous donner une liste des noms de ceux qui ont une sauvegarde existante:

$files = gci <directory path> -name 
    $backups = $files | where {$_ -match "\.backup\.[^\.]+$"} 
    $backedup = $backups | foreach {$_ -replace "backup\."} 
    $newbackups = $backedup | where {$files -contains $_} 

obtenir les noms de tous les .backup. des dossiers.
Supprimez le fichier .backup du nom.
Voir si la liste de fichiers d'origine a un nom correspondant à ce qui reste.

+0

Ne pourriez-vous utiliser comparer objet pour comparer les listes de fichiers dans les répertoires 2? –

+0

Nice. La partie qui me manquait était redirigée directement vers un foreach afin que je puisse faire un second get-childitem basé sur les chaînes hackées pour les fichiers "sauvegardés". Merci! – bwerks

+0

J'aurais pu utiliser compare-object, mais honnêtement, je trouve ça bizarre au code et moche à regarder. Pour les petits travaux par lots, je trouve que -contains est plus intuitif à lire. Pour les comparaisons répétitives à grande échelle, j'utilise -match. – mjolinor

0

Voici ce que j'ai fini avec.

get-childitem | ?{$_.name -match '.*backup\..*'} | %{$_.name -replace 'backup\.',''} | %{get-childitem $_} | copy-item -destination {$_.name -replace '\.([^.]*)$','.backup.2011-01-25.$1'}