从源代码目录中的文件复制到目标目录,而排除指定的目录中的特定文件类型(Copy files from

2019-10-18 15:38发布

我创建了一个简单的PowerShell脚本从目标目录中的部署过程中的文件复制到源目录,我想排除的文件列表。 不过需要说明的是,我想如果指定只从一个子目录排除文件的能力。 这是我用来执行复制和排除的文件列表中的片段:

$SourceDirectory = "C:\Source"
$DestinationDirectory = "C:\Destination"
$Exclude = @("*.txt*", "*.xml*") 

Get-ChildItem $SourceDirectory -Recurse -Exclude $Exclude | Copy-Item -Destination {Join-Path $DestinationDirectory $_.FullName.Substring($SourceDirectory.length)}

无论他们出现在目录树这将排除指定的文件。 当我想获得与排除列表是这样的:

$Exclude = @("*Sub1\.txt*", "*.xml*").

这将只在Sub1的文件夹排除.txt文件,而.xml文件将完全被置之不理。 我知道这是不行的,但我希望它有助于更​​好地展示我试图解决这个问题。

我曾考虑使用多维数组,但我不知道这可能是矫枉过正。 任何帮助,将不胜感激。

Answer 1:

这是做这件事

$SourceDirectory = 'C:\Source'
$DestinationDirectory = 'C:\Destination'
$ExcludeExtentions = '*.txt*', '*.xml*' 

$ExcludeSubDirectory = 'C:\Source\bad_directory1', 'C:\Source\bad_directory2'

Get-ChildItem $SourceDirectory -Recurse -Exclude $ExcludeExtentions | 
Where-Object { $ExcludeSubDirectory -notcontains $_.DirectoryName } |
Copy-Item -Destination $DestinationDirectory

在这里你最好的朋友是Where-Object ,或where 。 它需要一个脚本块作为参数,并使用该脚本块来验证通过管道进入每个对象。 只有使脚本返回对象$true通过传送Where-Object

此外,看一看,表示你得到一个文件的对象Get-ChildItem 。 它有NameDirectoryDirectoryName文件包含的至少1个FullName分别已经分裂。 Directory实际上是代表父目录的对象, DirectoryName是一个字符串。 Get-Member命令行会帮助你发现隐藏的宝石等。



Answer 2:

$SourceDirectory =   'C:\Source'
$DestinationDirectory = 'C:\Destintation'
$ExcludeExtentions1 = "^(?=.*?(SubDirectory1))(?=.*?(.xml)).*$"
$ExcludeExtentions2 = "^(?=.*?(SubDirectory2))(?=.*?(.config)).*$"
$ExcludeExtentions3 = "^(?=.*?(.ps1))((?!SubDirectory1|SubDirectory2).)*$"
$ExcludeExtentions4 = ".txt|.datasource"

$files = Get-ChildItem $SourceDirectory -Recurse

foreach ($file in $files)
{
    if ($file.FullName -notmatch $ExcludeExtentions1 -and $file.FullName -notmatch $ExcludeExtentions2 -and $file.FullName -notmatch $ExcludeExtentions3-and $file.FullName -notmatch $ExcludeExtentions4)
    {
       $CopyPath = Join-Path $DestinationDirectory $file.FullName.Substring($SourceDirectory.length)
       Copy-Item $file.FullName -Destination $CopyPath
    }
}

在此方案中,使用正则表达式和-notmatch我能够从特定的目录中排除特定文件类型。 $ ExcludeExtentions1只会从SubDirectory1排除XML文件,$ ExcludeExtentions2只会从SubDirectory2排除配置文件,$ ExcludeExtentions3将整个排除PS1文件,只要他们不是在任何两个子目录,$ ExcludeExtentions4将排除TXT和数据源文件树。

我们实际上并没有使用所有我们的解决方案,这些比赛,但因为我在做这个,我想我会在其他情况下添加多个条件,能够从这种方式中获益。

这里有几个链接,还帮助: http://www.tjrobinson.net/?p=109 http://dominounlimited.blogspot.com/2007/09/using-regex-for-matching-multiple-words。 HTML



文章来源: Copy files from source directory to target directory and exclude specific file types from specified directories