2011-02-08 18 views
6

Necesito copiar una gran cantidad de archivos en una carpeta de respaldo, pero quiero mantener sus rutas relativas. Solo necesito archivos específicos; es decir,Copie un archivo que incluya su ruta relativa

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

Pero sólo tengo que copiar los archivos EXT1 así:

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

Las rutas de origen son de múltiples profundidades. Esto es lo que tengo que copiar los archivos:

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

Esto se vuelca todos los archivos en C: \ backup \ y no parece tener cualquiera de los caminos. No estoy seguro de cómo se haría esa parte.

Respuesta

6

Algo como esto podría funcionar:

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

No es inteligente, pero es rápida & sucia y funciona sin mucho esfuerzo.

+1

Es posible que desee duplicar esas barras invertidas en 'C: \ scripts \' en el reemplazo. Esa es una expresión regular. – mjolinor

+0

Por supuesto, thx. Siempre me olvido de eso :) – stej

+0

Parece que va a hacer el trabajo. Le daré una oportunidad y le diré si funciona. – MrGrant

1

puede probar esta

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 } 

el nuevo ítem está allí con el fin de forzar la creación camino.

Jean Paul

2

Utilice robocopy.

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

Oops. No me di cuenta de que también querías agregar la extensión .bak. Todavía pienso que es una buena idea utilizar Robocopy para copiar los archivos a continuación:

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

Podría hacer esto con robocopy sí, pero quería ver si había una manera de hacerlo con puramente Powershell. – MrGrant

3

get-childitem vuelve rutas absolutas, pero se puede hacer de ellos relativo al directorio de trabajo actual de la siguiente manera:

resolve-path -relative 

Así que para copiar un conjunto filtrado de archivos desde el directorio actual de forma recursiva a un directorio de destino: se necesita

$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; } 

nuevo elemento para crear los directorios padre

Get-Item proporciona una visualización de todos los nuevos archivos que creó

Por supuesto Robocopy hace todo esto, pero habrá momentos en los que desea hacer un filtrado más especial o planchado de nombre de archivo ...

+0

Puedes pasar el indicador '-File' a' get-childitem' y por lo tanto no tienes que hacer 'where-object {! $ _. PSIsContainer}' – Polymorphix

Cuestiones relacionadas