Исключение нескольких папок при копировании с помощью powershell

Цель состоит в том, чтобы скопировать папки и файлы из пути в другой путь с помощью PowerShell. Однако я хочу исключить копирование определенных файлов и папок. Мне удалось исключить несколько файлов, добавив их в список исключений

Get-ChildItem -Path $source -Recurse -Exclude "web.config","body.css","Thumbs.db" 

Для исключения папок я добавил

$directory = @("Bin")
?{$_.fullname -notmatch $directory}

и окончательный вариант сценария выглядит

Get-ChildItem -Path $source -Recurse -Exclude "Web.config","body.css","Thumbs.db" | ?{$_.fullname -notmatch $directory} | Copy-Item -Force -Destination {if ($_.GetType() -eq [System.IO.FileInfo]) {Join-Path $dest $_.FullName.Substring($source.length)} else {Join-Path $dest $_.Parent.FullName.Substring($source.length)}}

Кажется, что это работает с одной папкой, но когда я добавляю несколько папок в исключенные каталоги, это, похоже, не работает. Что можно сделать, чтобы исключить несколько папок?

3 ответа

$source = 'source path'
$dest = 'destination path' 
[string[]]$Excludes = @('file1','file2','folder1','folder2')
$files =  Get-ChildItem -Path $source -Exclude $Excludes | %{ 
$allowed = $true
foreach ($exclude in $Excludes) { 
    if ((Split-Path $_.FullName -Parent) -match $exclude) { 
        $allowed = $false
        break
    }
}
if ($allowed) {
    $_.FullName
}
}
copy-item $source $dest -force -recurse 

Приведенный выше код исключает несколько папок, перечисленных в массиве $Exclude, и копирует оставшееся содержимое в папку назначения

Попробуй это:

$excluded = @("Web.config", "body.css","Thumbs.db")
Get-ChildItem -Path $source -Recurse -Exclude $excluded

Из комментария, если вы хотите исключить папки, вы можете использовать что-то вроде этого:

Get-ChildItem -Path $source -Directory -Recurse  | 
      ? { $_.FullName -inotmatch 'foldername' }

ИЛИ вы можете сначала проверить контейнер, а затем сделать это:

Get-ChildItem -Path $source -Recurse  | 
      ? { $_.PsIsContainer -and $_.FullName -notmatch 'foldername' }

Так как $directory это массив, вы должны искать соответствие его содержимому, а не самому себе (досадно, что powershell позволяет обрабатывать одноэлементные массивы как их содержимое).

Ты можешь попробовать:

?{$directory -contains $_.fullname}

Вместо:

?{$_.fullname -notmatch $directory}
Другие вопросы по тегам