我创建了一个简单的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文件将完全被置之不理。 我知道这是不行的,但我希望它有助于更好地展示我试图解决这个问题。
我曾考虑使用多维数组,但我不知道这可能是矫枉过正。 任何帮助,将不胜感激。
这是做这件事
$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
文件包含的至少1个FullName
分别已经分裂。 Directory
实际上是代表父目录的对象, DirectoryName
是一个字符串。 Get-Member
命令行会帮助你发现隐藏的宝石等。
$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