Powershell Get-ChildItem Include\Exclude - script simples não funciona corretamente

Powershell Get-ChildItem Include\Exclude - script simples não funciona corretamente

Estou tentando executar o código a seguir como um script do PowerShell, mas não consigo fazê-lo funcionar. Primeiro, o seguinte funciona com um -Includeitem, mas não consigo fazê-lo funcionar com vários. Segundo, o -Excludeperímetro parece não funcionar. Eu ainda recebo arquivos doC:\WindowseC:\Arquivos de Programasdiretórios.

$Include = "*.zip","*.rar","*.tar","*.7zip"
$exclude = "C:\Windows","C:\Program Files"
Get-ChildItem "C:\" -Include $Include -Exclude $Exclude -Recurse -Force -ErrorAction silentlycontinue | Select-Object -ExpandProperty FullName

Nota: O objetivo deste script é localizar todos os arquivos compactados no sistema. Eu sei que isso provavelmente é muito simples, mas simplesmente não consigo fazê-lo funcionar.

Responder1

O -Excludeparâmetro nunca funcionou corretamente. Parece corresponder à Namepropriedade, o que normalmente não é muito útil. Você provavelmente só precisa fazer a filtragem sozinho:

$Include = "*.zip","*.rar","*.tar","*.7zip"
Get-ChildItem "C:\" -Include $Include -Recurse -Force -ErrorAction silentlycontinue | 
    ? { $_.FullName -notmatch "^C:\\Windows" -and $_.FullName -notmatch "^C:\\Program" } |
    Select-Object -ExpandProperty FullName

(A propósito, -Filteré muito, muito mais rápido que -Include. A desvantagem é que você não pode fornecer uma variedade de padrões como faz com -Include. Mas ainda pode ser mais rápido, mesmo que você tenha que pesquisar quatro vezes. Não consegui diga com certeza. Pode valer a pena testar se a velocidade é importante para você.)

Responder2

Concordo com o dangph que -exclude não funciona como esperado.
Ao usar -notmatch você pode construir um padrão regex com um ou |.
Isso funciona aqui com o $ include revisado:

$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'
Get-ChildItem "C:\" -Include $Include -Recurse -Force -EA 0| 
  Where FullName -notmatch $exclude|
  Select-Object -ExpandProperty FullName

EditarComo as pastas excluídas são de primeiro nível, é muito mais rápido não iterá-las, portanto, uma abordagem em duas etapas é mais eficiente:

$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'

Get-ChildItem "C:\" -Directory |
  Where FullName -notmatch $exclude|ForEach {
  Get-ChildItem -Path $_.FullName -Include $Include -Recurse -Force -EA 0| 
  Select-Object -ExpandProperty FullName
}

informação relacionada