目前我正在使用此行收集特定路径(及其后)的所有文件
$files = Get-ChildItem -Path $loc -Recurse | ? { !$_.PSIsContainer }
但是现在我一直要求生成这个列表,同时排除(例如)所有" docx"和" xlsx"文件...和名为"脚本的文件夹"和他们的内容
我想将这些文件扩展名和目录名从txt文件读入数组,然后只使用该数组。
速度也很重要,因为我将对这些文件执行的功能需要足够长的时间,我不需要这个过程减慢我的脚本10完全放松(有点可以)
非常感谢任何输入
失败的尝试:
gi -path H:\* -exclude $xfolders | gci -recurse -exclude $xfiles | where-object { -not $_.PSIsContainer }
我认为这样可行,但只在H:\ drive
的根目录下排除了文件夹答案 0 :(得分:3)
这样的东西?我只比较了相对路径(来自$ loc的路径),以防$loc
包含一个要忽略的文件夹名称。
$loc = "C:\tools\scripts\myscripts\"
$files = Get-ChildItem -Path $loc -Recurse -Exclude *.docx, *.xlsx | ? { !$_.PSIsContainer -and !($_.FullName.Replace($loc,"") -like "*scripts\*") }
多个文件夹(这很难看):
#Don't include "\" at the end of $loc - it will stop the script from matching first-level subfolders
$loc = "C:\tools\scripts\myscripts"
$ignore = @("testfolder1","testfolder2");
$files = Get-ChildItem -Path $loc -Recurse -Exclude *.docx, *.xlsx | ? { !$_.PSIsContainer } | % { $relative = $_.FullName.Replace($loc,""); $nomatch = $true; foreach ($folder in $ignore) { if($relative -like "*\$folder\*") { $nomatch = $false } }; if ($nomatch) { $_ } }
答案 1 :(得分:0)
如果我理解了这个问题,那你就走上了正确的道路。要排除* .docx文件和* .xlsx文件,您需要将它们作为过滤字符串数组提供给-exclude parm。
$files = Get-ChildItem -Path $loc -Recurse -Exclude @('*.docx','*.xlsx') | ? { !$_.PSIsContainer }
答案 2 :(得分:0)
我也试图这样做,Graimer的答案不起作用(方式太复杂了),所以我想出了以下内容。
$ignore = @("*testfolder1*","*testfolder2*");
$directories = gci $loc -Exclude $ignore | ? { $_.PSIsContainer } | sort CreationTime -desc
答案 3 :(得分:0)
在PowerShell的第3版中,我们可以告诉Get-ChildItem只显示如下文件:
PS> $files = Get-ChildItem -File -Recurse -Path $loc
如果您只想收集某些文件名(例如abc * .txt),您还可以使用过滤器:
PS> $files = Get-ChildItem -File -Recurse -Path $loc -Filter abc*.txt