1

目前我正在使用这一行来收集某个路径(及以后)中的所有文件

$files = Get-ChildItem -Path $loc -Recurse | ? { !$_.PSIsContainer }

但是现在我一直要求生成此列表,同时排除(例如)所有“docx”和“xlsx”文件......以及名为“scripts”的文件夹及其内容

我想将这些文件扩展名和目录名从 txt 文件读入一个数组并简单地使用该数组。

速度也很重要,因为我将在这些文件上执行的功能需要足够长的时间,我不需要这个过程减慢我的脚本 10 完整(有点可以)

非常感谢您的任何意见

失败的尝试:

gi -path H:\* -exclude $xfolders | gci -recurse -exclude $xfiles | where-object { -not $_.PSIsContainer }

我认为这有效,但仅在 H:\ 驱动器的根目录排除文件夹

4

4 回答 4

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) { $_ } }
于 2013-01-18T19:29:13.263 回答
0

我也在尝试这样做,而Graimer的答案没有奏效(也太复杂了),所以我想出了以下内容。

$ignore = @("*testfolder1*","*testfolder2*");
$directories = gci $loc -Exclude $ignore | ? { $_.PSIsContainer } | sort CreationTime -desc
于 2013-11-13T17:18:51.790 回答
0

如果我理解了这个问题,那么您就走在了正确的道路上。要排除 *.docx 文件和 *.xlsx 文件,您需要将它们作为过滤字符串数组提供给 -exclude 参数。

$files = Get-ChildItem -Path $loc -Recurse -Exclude @('*.docx','*.xlsx') | ? { !$_.PSIsContainer }
于 2013-01-18T19:29:50.160 回答
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
于 2017-08-22T05:18:22.887 回答