在PowerShell中包含排除文件和文件夹的Copy-Item

时间:2016-02-02 10:20:09

标签: arrays powershell

我有一个问题。我想将一个目录的内容复制到另一个目录并取得一些进展。但是,目前我被卡住了,因为如果我可以定义要排除的文件数组我有文件夹数组的问题。所以数组看起来像:

$excludeFiles = @('app.config', 'file.exe')
$excludeFolders = @('Logs', 'Reports', 'Backup', 'Output')

当$ excludeFolders数组中只有一个项目时,它有效,但如果我添加多个项目,它会复制所有文件夹而不排除它们。

我有脚本:

Get-ChildItem -Path $binSolutionFolder -Recurse -Exclude $excludeFiles | 
where { $excludeFolders -eq $null -or $_.FullName.Replace($binSolutionFolder, "") -notmatch $excludeFolders } |
Copy-Item -Destination {
    if ($_.PSIsContainer) {
        Join-Path $deployFolderDir $_.Parent.FullName.Substring($binSolutionFolder.length -1)
    }
    else {
        Join-Path $deployFolderDir $_.FullName.Substring($binSolutionFolder.length -1)
    }
} -Force -Exclude $excludeFiles

$ binSolutionFolder是源,$ deployFolderDir是目标。 文件工作正常,但对于文件夹,我已经没有想法。

1 个答案:

答案 0 :(得分:1)

-notmatch使用正则表达式而不是集合。要匹配可以使用-notin $excludedfolders的单词集合,但如果路径包含2个级别的文件夹或只是简单的\,则测试将失败。

我会使用-notmatch,但首先创建一个正则表达式模式,检查所有文件夹。例如:

$excludeFiles = @('app.config', 'file.exe') 
$excludeFolders = @('Logs', 'Reports', 'Backup', 'Output','Desktop')
$excludeFoldersRegex = $excludeFolders -join '|'

Get-ChildItem -Path $binSolutionFolder -Recurse -Exclude $excludeFiles | 
where { $_.FullName.Replace($binSolutionFolder, "") -notmatch $excludeFoldersRegex } |
.....