2011-02-08 4 views
6

Je dois copier un grand nombre de fichiers dans un dossier de sauvegarde mais je veux conserver leurs chemins relatifs. J'ai seulement besoin de fichiers spécifiques; à savoirCopie d'un fichier incluant son chemin relatif

C:\scripts\folder\File.ext1 
C:\scripts\folder2\file2.ext2 
C:\scripts\file3.ext1 

Mais je ne ai besoin de copier les fichiers EXT1 comme ceci:

C:\backup\folder\File.ext1.bak 
C:\backup\file3.ext1.bak 

Les chemins source sont des profondeurs multiples. Ce est ce que je dois copier les fichiers:

$files = gci -path C:\scripts\ -recurse -include *.ext1 
$files | % { Copy-Item $_ "$($_).bak"; move-item $_ -destination C:\backup\ } 

Ce juste dumps tous les fichiers dans C: \ sauvegarde \ et ne semble pas obtenir l'un des chemins. Je ne sais pas comment cette partie serait faite.

Répondre

6

Quelque chose comme cela pourrait fonctionner:

gci -path C:\scripts\ -recurse -include *.ext1 | 
    % { Copy-Item $_.FullName "$($_.FullName).bak" 
     move-item $_.FullName -destination ($_.FullName -replace 'C:\\scripts\\','C:\backup\') } 

Il est pas intelligent, mais il est rapide & sale et fonctionne sans beaucoup d'effort.

+1

Peut vouloir doubler ces barres obliques inverses dans 'C: \ scripts \' dans le remplacement. C'est une regex. – mjolinor

+0

Bien sûr, merci. J'oublie toujours ça :) – stej

+0

On dirait que ça va faire l'affaire. Je vais essayer et vous faire savoir si cela fonctionne. – MrGrant

1

Vous pouvez essayer cette

Clear-Host 
$from = "'C:\scripts\" 
$to = "'C:\backup\" 
$inc = @('*.ext1', '*.extx') 
$files = get-childItem -path $from -include $inc -Recurse 
$files | % {$dest = (Join-Path $to $($_.FullName+".bak").SubString($from.length)); $dum = New-Item -ItemType file $dest -Force; Copy-Item -Path $_ -Destination $dest -Recurse -Force } 

le nouveau produit est là pour forcer la création de chemin.

Jean Paul

2

Utiliser robocopy.

robocopy c:\scripts c:\backup *.ext1 /s 

Oups. Je n'ai pas remarqué que vous vouliez ajouter l'extension .bak aussi. Je pense toujours qu'il est une bonne idée d'utiliser Robocopy pour copier les fichiers puis:

dir c:\backup -recurse -include *.ext1 | % { ren $_ "$_.bak" } 
+1

Je pourrais le faire avec robocopy oui mais je voulais voir s'il y avait un moyen de le faire avec PowerShell purement. – MrGrant

3

get-childitem retourne des chemins absolus, mais vous pouvez les faire par rapport au répertoire de travail actuel comme suit:

resolve-path -relative 

donc, pour copier un ensemble filtré de fichiers à partir du répertoire courant récursive dans un répertoire de destination:

$dest = "c:\dest" 
$filter = "*.txt" 

get-childitem -recurse -include $filter | ` 
    where-object { !$_.PSIsContainer } | ` 
    resolve-path -relative | ` 
    % { $destFile = join-path $dest $_; new-item -type f $destFile -force | out-null; copy-item $_ $destFile; get-item $destfile; } 

nouveau point est nécessaire pour créer les répertoires parents

get-item fournit un affichage de tous les nouveaux fichiers qu'il a créé

Bien sûr robocopy fait tout cela, mais il y aura des moments où vous voulez faire un filtrage ou nom de fichier mangling plus spécial ...

+0

Vous pouvez passer l'indicateur '-File' à' get-childitem' et ainsi ne pas avoir à faire 'where-object {! $ _. PSIsContainer}' – Polymorphix