2

У меня есть две папки, A и B, которые содержат в основном одинаковые имена файлов, но некоторые файлы отсутствуют в A

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

В
| 1.txt // это должно быть удалено
| 2.txt
| 10.txt
| asd.txt // это должно быть удалено
| asdfg.txt // это следует удалить
| zxc.txt

Как я могу удалить все файлы из B, которые не имеют основного имени с тем же файлом в A? Итак, в конце B должны остаться те же имена файлов, что и в A.

Это не обязательно должен быть PowerShell, мне просто нужен способ массового удаления файлов в Windows 10.

2 ответа2

4

В PowerShell всегда есть альтернативный способ.
С этим начальным деревом (на 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

Это один лайнер выводит:

PS A:\> gci B|?{! (test-path ("A\$($_.Name)"))}|rm -whatif
What if: Performing the operation "Remove File" on target "A:\B\1.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".

Более подробная версия (! не равно)

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

Никаких переменных, только трубопровод (при условии)

3

Согласно комментарию @flolilolilo, это сработало:

$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
  }
}

Я должен был искать for синтаксиса в PowerShell, так что я надеюсь , что это правильно. Это сработало в моем случае.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .