Исключить одну папку и тип файла из Get-childitem

У меня есть веб-сайт, для которого требуется частое резервное копирование, поэтому я хотел бы написать сценарий для сжатия всех файлов на снимке экрана. Кроме:

  1. Все содержимое папки изображений (см. Выделено)
  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 

1 ответ

Как отмечает Theo , начиная с PowerShell 7.2:

  • (а также и -Filter) работают только с именами файлов и каталогов , а не с путями .

  • Точно так же не поддерживает исключение целых поддеревьев каталогов (каталога и всего его содержимого).

Преодоление этих ограничений в будущей версии PowerShell для -Include а также -Excludeобсуждается в выпуске GitHub #15159.

Следовательно, вам придется самостоятельно выполнить пост-фильтрацию:

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

Примечание. Поскольку вы используете Get-ChildItemпараметра, выходные объекты являются строками , а именно относительными путями , поэтому каждый входной объект в блок скрипта (отраженный в автоматической переменной ) в целом сопоставляется с с выражениемподстановочным знаком, которое соответствует строкам, начинающимся с image\.

Без -Name, System.IO.FileInfo экземпляры будут выведены, и в этом случае вам нужно будет использовать следующую команду фильтра:
Where-Object { $_.FullName -notlike '*\image\*' } или - используя Where-Object«S упрощенный синтаксис :
Where-Object FullName -notlike *\image\*

Следует отметить , что, по состоянию на PowerShell 7.2, упрощенный синтаксис в настоящее время не доступны для операций , выполняемых на входе объекта в целом , так как имя собственности для работы на не требуется. То есть,
Where-Object -notlike *\image\*- с операндом LHS неявно весь входной объект ( $_) - не работает, хотя поддержка этого обсуждается в выпуске GitHub #8357.

Другие вопросы по тегам