2011-09-23 9 views
33

Estoy tratando de copiar un archivo a una nueva ubicación, manteniendo la estructura del directorio.¿Debería Copy-Item crear la estructura de directorio de destino?

$source = "c:\some\path\to\a\file.txt" 
destination = "c:\a\more\different\path\to\the\file.txt" 

Copy-Item $source $destination -Force -Recurse 

pero me da un DirectoryNotFoundException:

Copy-Item : Could not find a part of the path 'c:\a\more\different\path\to\the\file.txt' 

Respuesta

66

La opción -recurse sólo crea una estructura de carpetas de destino si la fuente es un directorio. Cuando la fuente es un archivo, Copy-Item espera que el destino sea un archivo o directorio que ya existe. Aquí hay un par de formas en que puedes evitarlo.

Opción 1: Copia directorios en lugar de archivos

$source = "c:\some\path\to\a\dir"; $destination = "c:\a\different\dir" 
# No -force is required here, -recurse alone will do 
Copy-Item $source $destination -Recurse 

Opción 2: 'Touch' el archivo primero y luego la sobrescribe

$source = "c:\some\path\to\a\file.txt"; $destination = "c:\a\different\file.txt" 
# Create the folder structure and empty destination file, similar to 
# the Unix 'touch' command 
New-Item -ItemType File -Path $destination -Force 
Copy-Item $source $destination -Force 
+0

¡Muchas gracias! –

+3

Gracias Shay. El método táctil es realmente útil, no es necesario recurrir a las carpetas de forma recursiva. – heedfull

+1

Interesante, el "toque" crea el directorio y el archivo, y el archivo es un archivo de una línea ... si abre el archivo en el bloc de notas (no importa cuál sea la extensión) ... el archivo tiene el ~ nombre original nombre completo ... como la línea 1 del archivo (¿texto?). Luego, el elemento de copiado está muy contento de que todas las carpetas existan correctamente. ¡GRACIAS! He expandido su respuesta para que sea la respuesta a mi pregunta aquí: http: // stackoverflow.com/questions/42818014/powershell-copy-files-with-a-blacklist-exclude-and-a-whitelist-include/42819089 # 42819089 – granadaCoder

2

he estado cavando alrededor y encontró una gran cantidad de soluciones para este problema, todas son algunas alteraciones, no solo un comando directo de copia de elementos. Concédele que algunas de estas preguntas sean anteriores a la PS 3.0, por lo que las respuestas no son incorrectas, pero con el uso de powershell 3.0 finalmente pude lograr esto usando el conmutador -Container para copiar elementos.

Copy-Item $from $to -Recurse -Container 

esta fue la prueba que realicé, sin errores y la carpeta de destino representaba la misma estructura de carpetas.

New-Item -ItemType dir -Name test_copy 
New-Item -ItemType dir -Name test_copy\folder1 
New-Item -ItemType file -Name test_copy\folder1\test.txt 
#NOTE: with no \ at the end of the destination the file is created in the root of the destination, does not create the folder1 container 
#Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2 -Recurse -Container 

#if the destination does not exists this created the matching folder structure and file with no errors 
Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2\ -Recurse -Container 
+0

Esto no es [lo que ** - Container ** tiene] (https: // stackoverflow.com/a/129385/3273963). Tienes un razonamiento equivocado para lo que está sucediendo. -Recurrir causará la creación de la carpeta de destino. La diferencia es cuando "test_copy2" no existe, el contenido de test_copy se convertirá (no se copiará en) test_copy2. Intenta hacer otra carpeta en test_copy, luego realiza copy-item sin crear test_copy2 y terminarás con un error. Y tampoco importa si usa "\" al final, -Container siempre es $ true y tiene una función diferente como se supone aquí. – papo

4

Alternativamente, la PS3.0 en adelante, sólo tiene que utilizar el New-Item para crear la carpeta de destino directamente, sin tener que crear un archivo "de prueba", por ejemplo, ...

New-Item -Type dir \\target\1\2\3\4\5 

... estará feliz de crear el objetivo \\ \ 1 \ 2 \ 3 \ 4 \ 5 Estructura independientemente de cuánto de lo que ya existe.

1

Tenía archivos en una sola carpeta en Windows 7 que quería renombrar y copiar a carpetas inexistentes.

he utilizado la siguiente secuencia de comandos PowerShell, que define una función Copy-New-Item como un contenedor para el Test-Item, New-Item y Copy-Item cmdlets:

function Copy-New-Item { 
    $SourceFilePath = $args[0] 
    $DestinationFilePath = $args[1] 

    If (-not (Test-Path $DestinationFilePath)) { 
    New-Item -ItemType File -Path $DestinationFilePath -Force 
    } 
    Copy-Item -Path $SourceFilePath -Destination $DestinationFilePath 
} 

Copy-New-Item schema_mml3_mathml3_rnc schema\mml3\mathml3.rnc 
# More of the same... 
Copy-New-Item schema_svg11_svg_animation_rnc schema\svg11\svg-animation.rnc 
# More of the same... 
Copy-New-Item schema_html5_assertions_sch schema\html5\assertions.sch 
# More of the same... 

(Tenga en cuenta que, en este caso, los nombres de archivo de origen no tienen extensión de archivo.)

Si la ruta del archivo de destino no existe, la función crea un archivo vacío en esa ruta, forzando la creación de cualquier directorio inexistente en la ruta del archivo. (Si Copy-Item puede hacer todo eso por sí mismo, no pude ver cómo hacerlo desde el documentation.)

Cuestiones relacionadas