Comando Powershell para excluir todos os arquivos que não existem em outra pasta

2

Eu tenho duas pastas, A e B, que contêm nomes de arquivos semelhantes, mas alguns arquivos estão faltando em A .

A
  | 2.txt
  | 10.txt
  | zxc.txt

B
  | 1.txt // isso deve ser excluído
  | 2.txt
  | 10.txt
  | asd.txt // isso deve ser excluído
  | asdfg.txt // isso deve ser excluído
  | zxc.txt

Como posso excluir todos os arquivos de B que não tenham um nome correspondente com o mesmo arquivo em A? Então, no final, B deve ter os mesmos nomes de arquivos que permanecem em A.

Não precisa ser o PowerShell, só preciso de uma maneira de remover os arquivos em massa no Windows 10.

    
por Cristy 02.09.2017 / 23:37

2 respostas

4

No PowerShell sempre existe um caminho alternativo.
Com esta árvore inicial (no ramdrive A:):

PS A:\> tree . /F
A:\
├───A
│       10.txt
│       2.txt
│       zxc.txt
│
└───B
        1.txt
        10.txt
        2.txt
        asd.txt
        asdfg.txt
        zxc.txt

Esse único liner produz:

PS A:\> gci B|?{! (test-path ("A\$($_.Name)"))}|rm -whatif
What if: Performing the operation "Remove File" on target "A:\B.txt".
What if: Performing the operation "Remove File" on target "A:\B\asd.txt".
What if: Performing the operation "Remove File" on target "A:\B\asdfg.txt".

A versão mais detalhada (! não é igual):

Get-ChildItem B|Where-Object {! (Test-Path ("A\$($_.Name)") ) }|Remove-Item

Não há vars apenas na tubulação (na condição)

    
por 03.09.2017 / 03:13
3

Como no comentário @flolilolilo, isso funcionou:

$A=GCI -Path ./A | select fullname,name;
$B=GCI -Path ./B | select fullname,name; 

for ($i = 0; $i -lt $B.Count ; $i++) {
  if($B[$i].name -notin $A.name){
    Remove-Item $B[$i].fullname
  }
}

Eu tive que procurar pela sintaxe for no PowerShell, então espero que esteja correto. Funcionou no meu caso.

    
por 02.09.2017 / 23:52