Powershell Get-ChildItem Incluir \ Excluir - script simples não está funcionando corretamente

3

Estou tentando executar o seguinte código como um script powershell, mas não consigo fazê-lo funcionar. Em primeiro lugar, o seguinte funciona com um item -Include , mas não consigo fazê-lo funcionar com vários. 2º, o -Exclude perimeter parece não funcionar. Eu ainda recebo arquivos das directorias C: \ Windows e C: \ Arquivos de Programas .

$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 é encontrar todos os arquivos compactados no sistema. Eu sei que isso é provavelmente muito simples, mas eu simplesmente não consigo fazê-lo funcionar.

    
por securityghost 20.03.2017 / 02:26

2 respostas

2

Concordo com o dangph de que o -exclude não funciona como esperado.
Ao usar -notmatch, você pode criar um padrão de regex com um ou | .
Isso funciona aqui com o $ 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

EDit Como as pastas excluídas são de primeiro nível, é muito mais rápido não interagir de forma alguma, 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
}
    
por 20.03.2017 / 03:59
1

O parâmetro -Exclude nunca funcionou corretamente. Parece coincidir com a propriedade Name , que normalmente não é muito útil. Você provavelmente só precisa fazer a filtragem:

$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

(By the way, -Filter é muito, muito mais rápido do que -Include . A desvantagem é que você não pode dar uma série de padrões como você pode com -Include . Mas ainda pode ser mais rápido mesmo Se você tivesse que procurar quatro vezes, eu não saberia dizer com certeza. Talvez valesse a pena testar se a velocidade é importante para você.

    
por 20.03.2017 / 03:03