1

我创建了一个简单的 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 文件。我知道这不起作用,但我希望它有助于更​​好地展示我正在尝试解决的问题。

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

4

2 回答 2

4

这是一种方法

$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。它具有Name,Directory和分别DirectoryName包含FullName已经拆分的文件。Directory实际上是一个代表父目录的对象,DirectoryName是一个字符串。Get-Membercommandlet 将帮助您发现隐藏的宝石。

于 2013-09-12T20:16:47.037 回答
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
    }
}

在此解决方案中,使用 regex 和 -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

于 2013-09-13T18:50:28.680 回答