Copie todos os arquivos com um certo nome usando o Powershell

3

Eu gostaria de encontrar e copiar todos os arquivos em um determinado diretório e tudo é sub-diretórios com um nome específico.

Eu estou usando Copy-Item em Powershell ( TechNet | ss64 )

Veja o que eu tenho:

Copy-Item '
    -Path \Server\Apps\* '
    -Destination C:\ReadMeFiles\ '
    -Include *ReadMe.txt '
    -Recurse '
    -WhatIf

Ele irá capturar o seguinte arquivo:

\Server\Apps\ReadMe.txt

Mas não:

\Server\Apps\AppName\ReadMe.txt

Mesmo que eu tenha especificado -recurse

Como posso obtê-lo para viajar para baixo em cada diretório?

    
por KyleMit 24.03.2015 / 19:53

2 respostas

3

Minha resposta ligeiramente modificada desta pergunta: Batch File: lista todos os arquivos de um tipo, renomeia arquivos, achata o diretório

Ele faz o que você deseja: copia arquivos usando curinga, nivela a estrutura de diretórios, manipula conflitos de nome de arquivo. Usa Get-ChildItem , como Tᴇcʜιᴇ007 sugerido.

# Setup source and destination paths
$Src = '\Server\Apps'
$Dst = 'C:\ReadMeFiles'

# Wildcard for filter
$Extension = '*ReadMe.txt'

# Get file objects recursively
Get-ChildItem -Path $Src -Filter $Extension -Recurse |
    # Skip directories, because XXXReadMe.txt is a valid directory name
    Where-Object {!$_.PsIsContainer} |
        # For each file
        ForEach-Object {

            # If file exist in destination folder, rename it with directory tag
            if(Test-Path -Path (Join-Path -Path $Dst -ChildPath $_.Name))
            {
                # Get full path to the file without drive letter and replace '\' with '-'
                # [regex]::Escape is needed because -replace uses regex, so we should escape '\'
                $NameWithDirTag = (Split-Path -Path $_.FullName -NoQualifier)  -replace [regex]::Escape('\'), '-'

                # Join new file name with destination directory
                $NewPath = Join-Path -Path $Dst -ChildPath $NameWithDirTag
            }
            # Don't modify new file path, if file doesn't exist in target dir
            else
            {
                $NewPath = $Dst
            }

            # Copy file
            Copy-Item -Path $_.FullName -Destination $NewPath
        }
    
por 26.03.2015 / 13:29
4

É um problema conhecido com o Copy-Item, você não pode especificar um curinga na fonte e usar o Recurse (e fazer com que ele funcione como esperado).

Se você não se importar também de copiar a estrutura de pastas (mas apenas copiar os readmes), tente usar a opção "Filtro". Algo como:

Copy-Item \Server\Apps\ C:\ReadMeFiles\ -Filter *ReadMe.txt -Recurse

Como alternativa, você pode usar Get-Child-Item com Recurse e um loop For para alimentar o Copy-Item, os arquivos um de cada vez.

    
por 24.03.2015 / 20:26