2016-12-01 10 views
0

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

Я пытаюсь скопировать всю структуру папок за исключением некоторых. Например, я хочу скопировать весь файл c: \ Program Files \ myTest в пункт назначения C: \ Program Files \ TargetTest за исключением (исключить следующие папки) c: \ Program Files \ myTest \ _Backup и c: \ Program Files \ myTest \ Процессор \ 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, но в любом случае скопировать папку Отчеты/файлы, которые я не хочу быть скопированы.

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

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

ответ

0

решение было не так просто, исключить папку исключения исключить, но не подпункты, переключатель -Filter использовать подстановочный знак, но взять одну строку в качестве параметров .. (кстати @ что бы ни было правильно, когда он сказал, включить Copy-Item отменить исключение на 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} 

Edit, потому что я не понимаю, что не работает в вашей конфигурации , давайте проверим полный сценарий с 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 } 
+0

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/129569/discussion-on-answer-by-freakydinde-powershell-not-excluding-specific-sub-folder). –

0

Ваша проблема является -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} 

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

+0

неправильно, при этом ваше решение, файлы будут сглажены в целевую папку, не сохранив исходную структуру дерева каталогов. – freakydinde

+0

Спасибо за ответ, я попробовал это. Вышеупомянутая проблема заключается в том, что она игнорирует структуру папок в исходной и скопированной подпапках в корне адресатов. Как причудливый сказал –

+0

@freakydinde Не могли бы вы посоветовать, как я могу это решить? –

 Смежные вопросы

  • Нет связанных вопросов^_^