Команда Powershell видалити всі файли, які відсутні в іншій папці


2

У мене є дві папки, A і B, які містять в основному схожі назви файлів, але деякі файли відсутні A.

А
| 2.txt
| 10.txt
| zxc.txt

Б
| 1.txt // це слід видалити
| 2.txt
| 10.txt
| asd.txt // це слід видалити
| asdfg.txt // це слід видалити
| zxc.txt

Як я можу видалити всі файли з B, які не мають відповідного імені з тим самим файлом у A? Отже, зрештою, у B повинні залишитися ті ж назви файлів, що й у A.

Це насправді не повинно бути повноцінним, просто мені потрібен спосіб масового видалення файлів у Windows 10.


Ви щось пробували? Я б це зробив, роблячи щось подібне $A=GCI -Path A:\ | select fullname,name; $B=GCI -Path B:\ | select fullname,name; if($B[$i].name) -notin $A.name){Remove-Item $B.fullname}.
flolilo

Зауважте, що назви файлів у A і B однакові, але вміст файлу різний (наприклад: подумайте про версії A та версію B цих файлів, але мені більше не потрібна версія B для тих, у кого більше немає версії A) .
Крісті

@flolilolilo Спасибі, я спробую це, у мене є 0 досвіду роботи з повноваженнями.
Крісті

Відповіді:


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

Не існує різноманітних трубопроводів (за умови)


Другий говорить, Remove-Objectщо не існує, перший виводить "виконання операції", але фактично не видаляє файли.
Крісті

1
@Cristy Вибачте, це так, Remove-Itemі якщо ви видалите -Whatif(з обережністю) перший, він повинен зробити.
LotPings

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, тож сподіваюся, що це правильно. Це спрацювало в моєму випадку.


Радий, що можу допомогти; і так, ви forправильно використали .
flolilo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.