Escrevendo um script powershell para copiar arquivos com determinada extensão de uma pasta para outra

10

Eu gostaria de escrever um script PowerShell que obtenha os seguintes parâmetros como entrada:
Pasta para copiar, extensões permite, pasta para copiar e um booleano, indicando se a mudança deve reiniciar o IIS, nome de usuário e senha. Que cmdlets devo considerar considerando que estou copiando para um servidor remoto?
Como faço para ler os parâmetros em variáveis?
Como faço para reiniciar o IIS?

Considerando que eu possa querer copiar várias pastas, como escrevo um script PowerShell que chame um script PowerShell?

    
por the_drow 26.10.2010 / 14:11

5 respostas

21

Get-ChildItem permite listar arquivos e diretórios, incluindo recursivamente com filtros de nome de arquivo. Copy-Item permite que você copie um arquivo.

Há muita sobreposição em termos de seleção dos arquivos, muitas vezes Copy-Item por si só é suficiente dependendo dos detalhes do que você precisa (por exemplo, você deseja manter a estrutura de pastas?)

Para copiar todos os *.foo e *.bar de StartFolder para DestFolder:

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

Se você precisa preservar a estrutura de pastas, as coisas ficam mais difíceis porque você precisa criar o nome da pasta 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
    }

Mas é provável que robocopy seja mais fácil:

robocopy StartFolder DestFolder *.foo *.bar /s

No final, a maneira de escolher dependerá dos detalhes do que é necessário.

(acima, evitei aliases (por exemplo, Copy-Item em vez de copy ) e uso explicitamente nomes de parâmetro, mesmo que sejam posicionais.)

    
por 16.01.2011 / 10:42
5

Não consigo endereçar a parte do IIS, mas a cópia do arquivo enquanto preservo a estrutura de diretórios pode ser muito mais simples do que a mostrada nas outras respostas:

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

O argumento -Container é a parte mágica que irá replicar a estrutura no destino como está na origem.

    
por 10.05.2012 / 21:19
0

Se você estiver usando o IIS7, poderá usar o componente nativo para replicar o conteúdo entre os servidores IIS: link

    
por 16.01.2011 / 10:16
0

A única solução que funcionou para mim é

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

Outras soluções que usam o parâmetro -Include não funcionaram.

    
por 16.03.2018 / 07:59
0

Como algumas pessoas mencionaram aqui, -Include não funciona.

Para que funcione com pastas aninhadas, usei duas etapas: "filtrar" + excluir pastas vazias

#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 
    
por 29.08.2018 / 12:30

Tags