2012-04-03 20 views
13

Me gustaría poder escribir un script de PowerShell que tome una carpeta (o un conjunto de carpetas) y duplicarlas en la estructura de la carpeta (sin el archivos) podría crearse, donde podría crearse la estructura de archivos (sin las carpetas), o en la que podrían crearse las carpetas de archivos (todos o seleccionados) Y.Copie carpetas sin archivos, archivos sin carpetas o todo usando PowerShell

Example: 

    C:\ProdData has 3 subfolders in it 
    C:\ProdData\Fld1 
    C:\ProdData\Fld2 
    C:\ProdData\Fld3 - has 2 subfolders under it 
    C:\ProdData\Fld3\MyFolder1 
    C:\ProdData\Fld3\MyFolder2 

Cada carpeta anterior tiene varios archivos en varios tamaños, de varias extensiones de archivos.

Me gustaría tener un script de PowerShell que implicaría una duplicación de la estructura de carpetas en otro lugar, y me da la opción de Estructura de carpetas Sólo, sólo archivos o archivos y carpetas a ser copiados.

En lo anterior, me gustaría ser capaz de copiar C: \ ProdData a otra carpeta, esencialmente, el cambio de nombre a ProdData TestData (es decir, C: \ ProdData copian en C: \ TestData), o para copiar toda la estructura de la carpeta.

C:\ProdData en otra carpeta que es una subcarpeta de otra cosa: C:\TestArea\TestFolders\2012-04-01\TestData\ProdData\Fld1, etc ...

Y elegir selectivamente para incluir carpetas, archivos o tanto.

La solución ideal sería (solo para carpetas) tomar la estructura de carpetas, exportarla/guardarla, leerla y crear esa misma estructura en otro lugar. Algunas soluciones que he encontrado dicen que copiaron solo la estructura de la carpeta, pero si existen datos, eso también se copia y no se puede excluir uno u otro. Tengo una solución parcial al requisito de sólo archivos que semi-conserva el camino, pero tomaría un archivo:

c:\ProdData\Fld1\MyFile.dat 

y copiarlo en:

c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat 

Pero eso no es algo que podría se decodifica fácilmente y sería imposible volver a integrar la estructura de origen. Agradecería cualquier idea sobre cómo lograr esto sin reinventar la rueda.

Respuesta

13

Para copiar todo en un hierarchie carpeta

Copy-Item $source $dest -Recurse -Force 

Para copiar el hierarchie que puede probar:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
Copy-Item $source $dest -Filter {PSIsContainer} -Recurse -Force 

para aplanar una estructura de archivos que puede probar:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
New-Item $dest -type directory 
Get-ChildItem $source -Recurse | ` 
    Where-Object { $_.PSIsContainer -eq $False } | ` 
    ForEach-Object {Copy-Item -Path $_.Fullname -Destination $dest -Force} 

¡Buena suerte!

26

Aquí hay algunas ideas para manejar cada situación que describa.

Estructura de carpetas Sólo

Esto copiará la fuente a un destino, de manera recursiva subdirectorios, pero excluyendo los archivos.

robocopy $source $dest /e /xf *.* 

Sólo los archivos (aplanar Estructura)

Hay algunas maneras de manejar esto, pero no sé de una manera especialmente buena o elegante. Este es un enfoque incómodo pero efectivo: para cada subdirectorio, ejecuta una copia no recursiva en una carpeta de destino raíz. La crítica o las alternativas más agradables serían bienvenidas.

Get-ChildItem $source -Recurse | 
    Where-Object { $_.PSIsContainer -eq $true } | 
    Foreach-Object { robocopy $_.FullName $dest } 

Todo

Este escenario es el más sencillo de todos.

robocopy $source $dest /e 

Usted puede experimentar con los interruptores de ti mismo (que hacen referencia a robocopy /? lo largo del camino) para afinar el proceso. El escenario más complicado en mi opinión es el que aplana la estructura del directorio. Tendrá que tomar algunas decisiones, por ejemplo, cómo desea manejar el mismo nombre de archivo que aparece en múltiples directorios.

cuanto a cómo aceptar las opciones de la línea de comandos, me gustaría sugerir la elaboración de conjuntos de parámetros de PowerShell para sus tres situaciones. Hay una serie de entradas de blog en torno a que discutir el concepto, pero también se puede ver TechNet o ejecutar help about_Functions_Advanced_Parameters dentro Powershell.

+0

Gracias por la sugerencia. No tenía ni siquiera instalado Robocopy, y se adapta bastante bien a las necesidades. Lo que terminé haciendo por la estructura de un archivo fue conectar el Show-Tree a un archivo de texto. Eso logró otra parte de lo que estaba buscando. Ninguna cosa lo haría todo, pero 3 piezas relativamente sencillas juntas lograron lo que necesitaba. ¡Gracias por su ayuda! Para el –

+0

aplanar uno, puede omitir la sección media y sólo tiene que utilizar la opción -File en Get-ChildItem como (y Copy-Item lugar de Robocopy): Get-ChildItem $ fuente -Recurse -File | Foreach-Object {Copy-Item $ _. FullName $ dest}. No es una gran diferencia sin embargo. – Brandon

+1

@Brandon Buen punto. Siempre y cuando esté en Powershell 3, puede hacerlo (los parámetros '-File' y' -Directory' no existían hasta v3). – ajk

1

Las siguientes copias sólo la estructura de carpetas de forma ProdData a TestData sin archivos

$from = "C:\ProdData" 
 
$to = "C:\TestData" 
 

 
Get-ChildItem -Path $from -Recurse | 
 
?{ $_.PSIsContainer } | 
 
Copy-Item -Destination {Join-Path $to $_.Parent.FullName.Substring($from.length)} -Force

Cuestiones relacionadas