2016-12-16 2 views
-1

У меня есть этот код PowerShell, который сравнивает 2 каталога и удаляет файлы, если файлы больше не существуют в исходном каталоге.Compare-Object Удалить файл, если файл не существует в источнике

Например у меня есть папка 1 & Папки 2. Я хочу сравнить папки 1 с папкой 2, если файл больше не существует в папке 1 она будет удалена из папки 2.

этого код работает нормально, но у меня есть проблема, когда он также набирает разницу в файлах по дате/времени. Я только хочу, чтобы подобрать значение, если файл больше не существует в папке 1.

Compare-Object $source $destination -Property Name -PassThru | Where-Object {$_.SideIndicator -eq "=>"} | % { 
     if(-not $_.FullName.PSIsContainer) { 
      UPDATE-LOG "File: $($_.FullName) has been removed from source" 
      Remove-Item -Path $_.FullName -Force -ErrorAction SilentlyContinue 
     } 
    } 

Есть дополнительные Where-Object {$ file1 <> $ file2} или что-то подобное.?

Cheers.

ответ

0

Я не знаю, как вы получаете информацию для $source и $destination Я предполагаю, что вы используете Get-ChildItem

Что я хотел бы сделать, чтобы устранить проблему с даты/времени будет не захватить его в этих переменных , Для примера:

$source = Get-ChildItem C:\temp\Folder1 -Recurse | select -ExpandProperty FullName 
$destination = Get-ChildItem C:\temp\Folder2 -Recurse | select -ExpandProperty FullName 

Делая это, вы получите только FullName свойство для каждого объекта, который является дочерним пункт не дата/время.

Вам нужно будет сменить часть скрипта после этого, чтобы он продолжал работать.

+0

Да, это код, который я использую $ source = Get-ChildItem $ pathofSourceFiles -Recurse | Исключить каталоги $ excludedDirectories $ destination = Get-ChildItem $ pathofDestination -Recurse | Исключить каталоги $ excludedDirectoriessing для получения информации: –

+0

Но, как я уже упоминал ранее, этот код отлично работает на файлы с таким же именем, но дата/время отличается, но не так, когда папка .. –

0

Следующего сценарий может сервер вашей цель

$Item1=Get-ChildItem 'SourecPath' 
$Item2=Get-ChildItem 'DestinationPath' 

$DifferenceItem=Compare-Object $Item1 $Item2 

$ItemToBeDeleted=$DifferenceItem | where {$_.SideIndicator -eq "=>" } 



foreach ($item in $ItemToBeDeleted) 
{ 
    $FullPath=$item.InputObject.FullName 

    Remove-Item $FullPath -Force 
} 

Надеется, что это помогает!

+0

Спасибо, я думаю, это в основном то, что я только что отредактировал. –

+0

приведенный выше код выполняет то, что вы запросили – Venkatakrishnan

0

Если я не ошибаюсь, проблема заключается в том, что ваш код удаляет файл с различной меткой времени по сравнению с исходным кодом: Вы пытались -ExcludeProperty?

$source = Get-ChildItem "E:\New folder" -Recurse | select -ExcludeProperty Date 
+0

Информация о Compare-Object -Property соответствует MSDN Задает массив свойств ссылочных и разностных объектов для сравнения. Если мой единственный -Property - это имя, почему оно вообще касается даты/времени. LIke, о котором я говорил ранее, отлично работает для файлов, но если у двух папок разная дата, но с тем же именем, то она набирает разницу –

0

попробовать что-то вроде этого

в PowerShell V5

$yourdir1="c:\temp" 
$yourdir2="c:\temp2" 

$filesnamedir1=(gci $yourdir1 -file).Name 
gci $yourdir2 -file | where Name -notin $filesnamedir1| remove-item 

в старом PowerShell

$yourdir1="c:\temp" 
$yourdir2="c:\temp2" 

$filesnamedir1=(gci $yourdir1 | where {$_.psiscontainer -eq $false}).Name 
gci $yourdir2 | where {$_.psiscontainer -eq $false -and $_.Name -notin $filesnamedir1} | remove-item 

, если вы хотите сравнить файл с несколькими директории, добавьте -recurse опцию в каждом gci

Смежные вопросы