Рекурсивно перемещать папки / файлы в подпапках в родительский - PullRequest
0 голосов
/ 05 мая 2018

У меня есть папка высокого уровня (назовите ее «уровень 0»), которая содержит около сотни подпапок («уровень 1»), и внутри этих подпапок состоит из подпапок и файлов более низкого уровня («уровень 2»). Мне нужно динамически переместить каждый файл и папку с «уровня 2» в его подпапку уровня 1 (или условно говоря - его родитель).

Для лучшей визуализации:

Master folder
├ Parent folder 1
│ ├─ Subfolder A
│ │  ├─ File A
│ │  └─ File B
│ ├─ Subfolder B
│ │  ├─ File C
│ │  └─ File D
│ ├─ File E
│ └─ File F
.
. ... many folders more ...
.
└─ Parent folder 134
   ├─ Subfolder CS
   │  ├─ File AGF
   │  └─ File ARH
   ├─ File ROQ
   └─ File JGL

Мне нужно переместить все содержимое любых подпапок в его родительскую папку. Как и выше, вы можете видеть, что в родительской папке уже могут быть некоторые файлы (например, файлы E, F), и они должны оставаться на месте.

Цель:

Master folder
├─ Parent folder 1
│  ├─ File A
│  ├─ File B
│  ├─ File C
│  ├─ File D
│  ├─ File E
│  └─ File F
├─ Parent folder 119
│  ├─ File AZA
│  ├─ File AZB
│  ├─ File AZC
│  └─ File AZD
... and so on

Сложность заключается в том, что под главной папкой находится более сотни этих родительских папок, и все они имеют разные имена. Подпапки в родительских папках также имеют разные имена.

Я пытался приблизиться к этому, используя Get-ChildItem, затем с помощью 'ForEach' пытался назначить дочерний элемент (т.е. папку) в качестве переменной, а затем выполнил другой Get-ChildItem рекурсив и переместил весь контент в родительский, но я я ничего не получаю, и если что-то движется, похоже, оно ссылается на папку C: \ Windows \.

Примечание [извините, исправление Не *], буквальный код, но подход, о котором я думаю:

$master = "\\data\Master"
gci $master | foreach {
    $parent = $_
    gci ... | Move-Item -Destination $parent
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Это должно делать то, что вы хотите. Однако он не будет перемещать любые файлы с тем же именем файла в родительскую папку, если имя файла уже использовалось.

$FilePath = Read-Host "Enter FilePath"
$FileSource = Get-ChildItem -Path $FilePath -Directory

foreach ($Directory in $FileSource)
{
    $Files = Get-ChildItem -Path $Directory -File

    foreach ($File in $Files){
        Move-item -Path $File.Fullname -Destination $FilePath
    }
}

Надеюсь, что это пригодится.

0 голосов
/ 05 мая 2018

Я пытался сделать что-то для вас. Это переместит все из папки level2 в папку level1. Пожалуйста, попробуйте, и дайте мне знать, как это работает.

$master = "C:\Temp\Level0\"
Get-ChildItem $master | ForEach-Object {
    $dest = ($_.fullname)+"\"
    $Loc = (Get-ChildItem $_.FullName | Select-Object -ExpandProperty fullname)+"\*"
    Move-item -Path $Loc -Destination $dest
}
...