Escrevendo um script do PowerShell para copiar arquivos com certa extensão de uma pasta para outra

10

Gostaria de escrever um script do PowerShell que obtém os seguintes parâmetros como entrada:
Pasta para copiar, extensões permite, pasta para copiar e um booleano indicando se a alteração deve reiniciar o IIS, nome de usuário e senha.
Quais cmdlets devo considerar considerando que estou copiando para um servidor remoto?
Como leio os parâmetros em variáveis?
Como reinicio o IIS?

Considerando que posso copiar várias pastas, como escrevo um script do PowerShell que chama um script do PowerShell?

the_drow
fonte
Uau, desculpe pelo atraso em qualquer resposta ... Você ainda precisa de ajuda?
Marco Shaw
Sim, eu realmente não sei como reiniciar o IIS? Como garantir que os arquivos sejam realmente copiados?
the_drow

Respostas:

22

Get-ChildItempermite listar arquivos e diretórios, inclusive recursivamente com filtros de nome de arquivo. Copy-Itempermite copiar um arquivo.

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

Para copiar tudo *.fooe *.bardo StartFolder para o DestFolder:

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

Se você precisar preservar a estrutura da pasta, as coisas ficarão mais difíceis porque você precisará 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 robocopyé provável que seja mais fácil:

robocopy StartFolder DestFolder *.foo *.bar /s

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

(No exemplo acima, evitei aliases (por exemplo, em Copy-Itemvez de copy) e usei explicitamente nomes de parâmetros, mesmo que sejam posicionais.)

Richard
fonte
2
Não funciona, eu tentei: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"com e sem -recurse - nada acontece
Carmageddon
6

Não consigo abordar a parte do IIS, mas a cópia do arquivo, preservando 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 -Containerargumento é a parte mágica que replicará a estrutura no destino, assim como na origem.

Mark Meuer
fonte
Eu sou incapaz de fazer com que isso funcione -Include... embora eu possa fazer com que copie tudo sem-Include
Ben Polinsky
1

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

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

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

Rustem Zinnatullin
fonte
1

Como algumas pessoas mencionadas aqui - Incluir não funciona.

Para fazê-lo funcionar com pastas aninhadas, usei a abordagem de duas etapas: 'filtro' + 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 
Vencedor
fonte