Powershell не исключает определенные подпапки при использовании команды копирования элемента

Я немного новый немой в PS. Я просмотрел очень много всех вопросов, зарегистрированных здесь, и старался изо всех сил, чтобы работать на меня, но, к сожалению, не работал на меня так, как я хотел бы.

Я пытаюсь скопировать всю структуру папок, за исключением некоторых. Например, я хочу скопировать весь c:\Program Files\myTest в место назначения C:\Program Files\TargetTest, кроме (исключая папки ниже) c:\Program Files\myTest\_Backup и c:\Program Files\myTest\Processor\Reports

     $SourceFolder = "$env:ProgramFiles\myTest\"
     $ReportExclude="$env:ProgramFiles\myTest\Processor\Reports\*.rdl"
     $TargetFolder = "$env:ProgramFiles\TargetTest"
     $BackupRootFolderName = "_Backup"
     $BackupRootFolderPath = "$TargetFolder\$BackupRootFolderName"
     $BackupFolderPath = "$BackupRootFolderPath\$(Get-Date -format yyyyMMdd_HHmmss)"

      Get-Item -Path $SourceFolder\* -Exclude $ReportExclude, _Backup| %  { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder -recurse}

Когда я запускаю приведенный выше код, он копирует все и исключает только _Backup, но все равно копирует папку/файлы отчетов, которые я не хочу копировать.

Может кто-нибудь посмотреть на это и указать мне, что я делаю неправильно.

Большое тебе спасибо


person Cortez Ninja    schedule 01.12.2016    source источник


Ответы (2)


решение было не таким простым, переключатель -Exclude исключает папку, но не подэлементы, переключатель -Filter использует подстановочный знак, но принимает одну строку в качестве параметров.. (кстати, @whatever был прав, когда он сказал переключатель -recurse на Copy- Элемент отменяет ваше исключение на Get-ChildItems)

наконец, я решил это грязным, но рабочим способом:

Get-ChildItem -Path $SourceFolder -Recurse | ? { $_.FullName -notlike $ReportExclude -and $_.FullName -notlike $BackupRootFolderName } | % { write-host $_.FullName; Copy-Item -Path $_.FullName -Destination $($_.FullName -replace $SourceFolder, $TargetFolder) -Force} 

Отредактируйте, потому что я не понимаю, что не работает в вашей конфигурации, давайте протестируем полный скрипт с помощью loggin:

$SourceFolder = "$env:ProgramFiles\myTest\" 
$ReportExclude = "$env:ProgramFiles\myTest\Processor\Reports\*.rdl" 
$TargetFolder = "$env:ProgramFiles\TargetTest" 

$BackupRootFolderName = "_Backup" 
$BackupRootFolderPath = "$TargetFolder\$BackupRootFolderName" 
$BackupFolderPath = "$BackupRootFolderPath\$(Get-Date -format yyyyMMdd_HHmmss)" 

$ErrorActionPreference = "Continue"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"

Function Copy-MyFiles($FileFullNameSource)
{
    try
    {
        Write-Verbose "file source : $FileFullNameSource"

        if ($FileFullNameSource -notlike $ReportExclude -and $FileFullName -notlike $BackupRootFolderName)
        {
            $FileFullNameDestination = $FileFullNameSource -replace $SourceFolder, $TargetFolder

            Write-Verbose "file destination : $FileFullNameDestination"

            Copy-Item -Path $FileFullNameSource -Destination $FileFullNameDestination -Force

            if (Test-Path $FileFullNameDestination)
            {
                Write-Host "$FileFullNameDestination ok" -ForegroundColor Green
            }
            else
            {
                Write-Warning "$FileFullNameDestination is missing in destination folder"
            }
        }
        else
        {
            Write-Host "$FileFullNameSource is excluded"
        }
    }
    catch
    {
        Write-Warning ($_.Exception | Select-Object -Property Message |  Out-String)
    }
}

Write-Verbose "source folder : $SourceFolder"
Write-Verbose "target folder : $TargetFolder"

Get-ChildItem -Path $SourceFolder -Recurse | % { Copy-MyFiles $_.FullName }
person freakydinde    schedule 01.12.2016
comment
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат< /а>. - person Aaron Hall; 01.12.2016

Ваша проблема заключается в переключателе -recurse в операторе элемента копирования. Get-Item предоставит этой команде папку "$env:ProgramFiles\myTest\",

Copy-Item -Recurse

затем скопирует эту папку, включая все подпапки. Попробуй это:

Get-ChildItem -Path $SourceFolder\* -Exclude $ReportExclude, _Backup -Recurse | %  { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder} 

Это должно сначала создать список всех папок и файлов (включая подпапки), игнорируя те, которые вы хотите исключить, а затем скопировать каждый из них в целевое место назначения.
черт. Проверю правильное решение, как только у меня будет время.

person whatever    schedule 01.12.2016
comment
неправильно, с этим вашим решением файлы будут сведены в целевую папку без сохранения древовидной структуры исходного каталога. - person freakydinde; 01.12.2016
comment
Спасибо за ответ, я попробовал это. Проблема с вышеизложенным заключается в том, что он игнорирует структуру папок в источнике и копирует подпапки в корне мест назначения. Как сказал причудливый - person Cortez Ninja; 01.12.2016
comment
@freakydinde Не могли бы вы посоветовать, как я могу это решить? - person Cortez Ninja; 01.12.2016
comment
Опубликовано решение @CortezNinja;) - person freakydinde; 01.12.2016