Escribir un script de PowerShell para copiar archivos con cierta extensión de una carpeta a otra

10

Me gustaría escribir un script de PowerShell que obtenga los siguientes parámetros como entrada:
carpeta para copiar, extensiones permitidas, carpeta para copiar y un booleano que indica si el cambio debe reiniciar IIS, nombre de usuario y contraseña.
¿Qué cmdlets debería mirar considerando que estoy copiando a un servidor remoto?
¿Cómo leo los parámetros en variables?
¿Cómo reinicio IIS?

Teniendo en cuenta que podría querer copiar varias carpetas, ¿cómo escribo un script de PowerShell que invoca un script de PowerShell?

the_drow
fuente
Wow, perdón por la demora en cualquier respuesta ... ¿Todavía necesitas ayuda?
Marco Shaw
Sí, realmente no sé cómo reiniciar IIS? ¿Cómo me aseguro de que los archivos se copien realmente?
the_drow

Respuestas:

22

Get-ChildItemle permite enumerar archivos y directorios, incluso de forma recursiva con filtros de nombre de archivo. Copy-Itemle permite copiar un archivo.

Hay mucha superposición en términos de selección de archivos, a menudo Copy-Itempor sí solo es suficiente dependiendo de los detalles de lo que necesita (por ejemplo, ¿desea conservar la estructura de la carpeta?)

Para copiar todo *.fooy *.bardesde StartFolder a DestFolder:

Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"

Si necesita preservar la estructura de la carpeta, las cosas se ponen más difíciles porque necesita construir el nombre de la carpeta de destino, algo como:

$sourcePath = 'C:\StartFolder'
$destPath = 'C:\DestFolder'

Get-ChildItem $sourcePath -Recurse -Include '*.foo', '*.bar' | Foreach-Object `
    {
        $destDir = Split-Path ($_.FullName -Replace [regex]::Escape($sourcePath), $destPath)
        if (!(Test-Path $destDir))
        {
            New-Item -ItemType directory $destDir | Out-Null
        }
        Copy-Item $_ -Destination $destDir
    }

Pero robocopyes probable que sea más fácil:

robocopy StartFolder DestFolder *.foo *.bar /s

Al final, la forma de elegir dependerá de los detalles de lo que se necesita.

(En lo anterior he evitado los alias (por ejemplo, en Copy-Itemlugar de copy) y uso explícitamente los nombres de los parámetros, incluso si son posicionales).

Ricardo
fuente
2
No funciona, lo intenté: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"con y sin -recurrencia - no pasa nada
Carmageddon
6

No puedo abordar la parte de IIS, pero la copia del archivo mientras se preserva la estructura del directorio puede ser mucho más simple de lo que se muestra en las otras respuestas:

Copy-Item -path "StartFolder" -Recurse -Include "*.foo","*.bar" -Destination "DestFolder" -Container

El -Containerargumento es la parte mágica que replicará la estructura en el destino tal como está en la fuente.

Mark Meuer
fuente
No puedo hacer que esto funcione -Include... aunque puedo hacer que copie todo sin-Include
Ben Polinsky
1

La única solución que funcionó para mí es

Copy-Item -path 'c:\SourceFolder\*.foo' -destination 'c:\DestFolder'

Otras soluciones que usan -Includeparámetros no funcionaron.

Rustem Zinnatullin
fuente
1

Como algunas personas mencionaron aquí -Incluir no funciona.

Para que funcione con carpetas anidadas, utilicé el enfoque de dos pasos: 'filtro' + eliminar carpetas vacías

#copy with folder structure
Copy-Item -path $source -Recurse -Filter "*.foo" -Destination $destination -Container

#remove empty folders
dir $destination -Directory -Recurse |
    %{ $_.FullName} |
    sort -Descending |
    where { !@(ls -force $_) } |
    rm 
Víctor
fuente