从 Get-childitem 中排除一个文件夹和一种文件类型

Exclude one folder and a filetype from Get-childitem

我有一个网站需要经常备份所以我想写一个脚本来压缩屏幕截图中的所有文件。除了:

  1. image 文件夹中的所有内容(见高亮部分)
  2. 整个目录中的任何 *.log 文件

我试图获取文件列表,但最终总是得到图像文件夹内容:

$WebAppFolder = 'C:\ReleaseBackupScript\MyWebSite'
$filteredList = Get-childitem -path $WebAppFolder -exclude $WebAppFolder"\image",*.log -Name -recurse -force
Out-File -FilePath FilteredList.txt -InputObject $filteredList 

Theo 所述,从 PowerShell 7.2 开始:

  • -Exclude(以及 -Include-Filter)仅对文件和目录 names 进行操作,不在路径.

  • 同样,-Exclude不支持排除整个目录子树(目录及其所有内容)。

-Include-Exclude 的未来 PowerShell 版本中克服这些限制正在 GitHub issue #15159 中讨论。

因此,您必须自己执行 post- 过滤自己:

$WebAppFolder = 'C:\ReleaseBackupScript\MyWebSite'
$filteredList = 
  Get-ChildItem -Recurse -Force -File -Name -LiteralPath $WebAppFolder -Exclude *.log |
    Where-Object { $_ -notlike 'image\*' } > FilteredList.txt

注意:由于您使用的 Get-ChildItem's -Name parameter, the output objects are strings, namely relative paths, which is why each input object to the Where-Object script block (reflected in automatic $_ variable) is matched as whole against a wildcard expression 匹配以 image\.

开头的字符串

如果没有-Name,将输出System.IO.FileInfo个实例,在这种情况下,您必须使用以下过滤器命令:
Where-Object { $_.FullName -notlike '*\image\*' } 或 - 使用 Where-Objectsimplified syntax:
Where-Object FullName -notlike *\image\*

请注意,从 PowerShell 7.2 开始,简化语法目前不适用于对整个输入对象执行的操作,因为需要操作的 属性 的名称。即,
Where-Object -notlike *\image\* - LHS 操作数 隐含地 是整个输入对象 ($_) - not 工作,虽然支持GitHub issue #8357.

中正在讨论