Исключение нескольких папок при копировании с помощью 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}