我使用类似下面的脚本来排除文件夹。 问题是文件名是文件夹名称,我只想排除文件夹而不是文件。例如,在下面我想排除" 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
答案 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。您需要在运行之前验证输出。