Исключить одну папку и тип файла из Get-childitem
У меня есть веб-сайт, для которого требуется частое резервное копирование, поэтому я хотел бы написать сценарий для сжатия всех файлов на снимке экрана. Кроме:
- Все содержимое папки изображений (см. Выделено)
- Любые файлы * .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.