Переместите файлы с помощью PowerShell в удаленное место на уровень выше, если файл не существует

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

Например, скопируйте только содержимое папки 2, потому что файл .txt не существует.

ИСХОДНЫЙ СЕРВЕР

C:\folder\folder1\foldera - test.txt file.txt

C:\folder\folder2\foldera - test.txt

станет

ЦЕЛЕВОЙ СЕРВЕР

C:\folder\folder2\ - test.txt

person user1767744    schedule 13.05.2013    source источник


Ответы (2)


Это не самый лучший код, но он должен работать с небольшими изменениями:

$Tester = "C:\Dell\Drivers\Sata\Test"

$Folders = [array]$Tester.split("\")
Write-Host $Folders
$Folders |`
ForEach {
    $CureToken = "$_\"
    if(Test-Path -Path "$Good$CureToken")
        {
        $Good = "$Good$CureToken"
        Write-Host $Good
        }
    }
    Write-Host "This Path Is Good: $Good"

Он возвращает правильный путь (который на два каталога выше исходной строки. Это выглядит так:

C:\Dell\Drivers\
This Path Is Good: C:\Dell\Drivers\

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

Вы также можете использовать

Copy-Item -Path $MyFileToCopy -Destination $Good

Для настоящей копии.

person Austin T French    schedule 13.05.2013

Извините, я неправильно понял ваш вопрос с самого начала. Я только что понял, что ваши условия для копирования файла только если они существуют в обеих папках.

Для этого можно использовать командлет Compare-Object. Приведенный ниже код сравнивает списки двух папок, проверяет наличие эквивалентов на основе имен файлов/каталогов и копирует их в папку назначения.

$target_directory = Get-Item -Path '\\dest-server\c$\folder\folder2'

$set1 = Get-ChildItem -Path 'c:\test1' -Recurse
$set2 = Get-ChildItem -Path 'c:\test2' -Recurse

Compare-Object -ReferenceObject $set1 -DifferenceObject $set2 -Property Name -IncludeEqual -ExcludeDifferent -PassThru | ForEach-Object { 

    # Copy files but will not overwrite files, use -ErrorAction SilentlyContinue to suppress errors. 
    Copy-Item $_.FullName -Destination $target_directory.FullName -ErrorAction Continue

}
person MFT    schedule 13.05.2013
comment
Привет, папка всегда будет иметь одно и то же имя, но папка 1/2 всегда будет называться по-разному. Мне нужно проверить наличие файла в первую очередь. Большое спасибо за все ответы :) - person user1767744; 13.05.2013
comment
Robocopy сравнивает конечный файл. Если это то же самое, он не будет выполнять копию. Вы хотите, чтобы он вел себя по-другому? - person MFT; 13.05.2013
comment
Я хочу, чтобы он проверял папку на наличие этого конкретного файла. Только если его там нет, он скопирует все в папку в удаленное место. - person user1767744; 13.05.2013