Powershell排除具有匹配文件名的文件夹

时间:2016-02-23 05:27:21

标签: regex powershell

我使用类似下面的脚本来排除文件夹。 问题是文件名是文件夹名称,我只想排除文件夹而不是文件。例如,在下面我想排除" B"仅限文件夹而不是" B.txt"文件,而如下所示的当前代码不包括文件和文件夹。

$exclude = @("*.cer")
$excludeMatch = @("Member", "A", "B" , "C" , "D")
[regex] $excludeMatchRegEx = ‘(?i)‘ + (($excludeMatch |foreach {[regex]::escape($_)}) –join “|”) + ‘’
Get-ChildItem -Path $source -Recurse -Exclude $exclude | 
where { $excludeMatch -eq $null -or `enter code here`$_.FullName.Replace($Source, "") -notmatch $excludeMatchRegEx} |
 Copy-Item -Destination {
 if ($_.PSIsContainer) {
   Join-Path $Dest `enter code here`$_.Parent.FullName.Substring($source.length)
  } else {
   Join-Path $Dest $_.FullName.Substring($source.length)
 }
 } -Force -Exclude $exclude 

1 个答案:

答案 0 :(得分:0)

如果您只想排除文件夹,那么很容易做到:

Get-ChildItem -Path \Temp -Recurse | Where-Object {$_.PSIsContainer -eq $false}

如果你想使用正则表达式来复合它,你也可以将它添加到Where-Object语句中:

Get-ChildItem -Path \Temp -Recurse | Where-Object {$_.PSIsContainer -eq $false -and $_.Name -match $regexPattern }

如果您觉得自己不想要某些东西,也会在那里扔一个-notmatch。

使用PowerShell要记住的一件事......根据我的经验,管道对于从shell执行命令很有用,但通常当你在个人命令字典中做了很好定义的事情时(像Get-ADUser -Filter {GivenName -eq "Sam"}之类的东西,但是当你尝试编写脚本时它并不是那么好 - 在这种情况下,你最好用Where-Object进行过滤,然后选择你需要的项目。如果你想要一个良好的调试体验,PowerShell有一个非常合理的调试器,你现在无法真正进入管道来评估某些东西是如何工作的。特别是如果你遇到问题的话。一个脚本或一系列命令,调试器可能是你绝对最好的朋友,我强烈建议你把它分解成单独的语句来做那些分析。

此外,Get-Member cmdlet可以说是Windows PowerShell中十大最有用的cmdlet之一(以及Get-Help,Where-Object,Select-Object,Get-Command和其他一些)。当您开始评估脚本将如何运行以分析您正在使用的对象的属性(在您的情况下,System.IO.FileInfo和System.IO.DirectoryInfo)时,它确实有帮助,以帮助减少以后刮你的头的数量。

我希望这有帮助!

修改

阅读完评论后,我正在修改我的答案,以便更好地适应问题描述。

如果您不希望保留源文件夹层次结构,则只需运行Get-ChildItem -Recurse | Where-Object { $_.PSIsContainer -eq $false -and $_.Name -match $regexPattern } | Copy-Item -Destination **target_folder**即可。 Copy-Item应该简单地将输出视为属于一个位置的输出。请注意,您还可以运行Copy-Item(以及修改支持-WhatIf参数的大多数其他cmdlet。您需要在运行之前验证输出。