Powershell перемещает элементы в подкаталогах только для имени папки, содержащей определенную строку - PullRequest
0 голосов
/ 20 марта 2019

Допустим, есть несколько папок, содержащих разные подпапки.В приведенном ниже примере есть корневая папка подкаталогов пользователя 1 и 3 в этой папке.Как создать зацикленный сценарий для перемещения элементов только из подкаталогов, содержащих строку «загрузить» на один уровень выше в папку пользователя.

->user1
--->user1upload
--->randomfolder1
--->randomfolder2
->user2
--->user2upload
--->randomfolder1
--->randomfolder2

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

$files = Get-ChildItem '*\*\*'
Get-ChildItem $files | Move-Item -Destination { $_.Directory.Parent.FullName }
$files | Remove-Item -Recurse

Я хочу исключить из этого другие папки, чтобы содержимое папок перемещалось в корневую пользовательскую папку только в папках с именем «upload».Как я могу это сделать?

РЕДАКТИРОВАТЬ: также попробовал это без удачи

$files = Get-ChildItem '*\*\*' | Select-String -Pattern "upload"
Get-ChildItem $files | Move-Item -Destination { $_.Directory.Parent.FullName }

РЕДАКТИРОВАТЬ 2 (21.03.2009) Чтобы было ясно, его для программы SFTP.В C: / usrs есть список пользовательских папок, и я хочу переместить файлы из c: / usrs / user1 / user1upload в C: / usrs / user1

1 Ответ

0 голосов
/ 20 марта 2019

Используется PowerShell 5 для указания -Directory.Это можно сделать другим способом, если вы еще не подключились к PowerShell 5.

Поиск каталогов, а затем поиск файлов в каталогах.

Когда вы уверены, что файлы будутДля правильного перемещения удалите -WhatIf из командлета Move-Item.

Get-ChildItem -Directory -Path $Env:USERPROFILE -Filter '*upload*' |
    ForEach-Object {
        Get-ChildItem -File -Path $_.FullName |
            ForEach-Object {
                Move-Item -Path $_.FullName -Destination $_.PSParentPath -WhatIf
            }
    }

Я думал, что вы находитесь в "пользовательских" каталогах, где вы обычно не имеете разрешения на доступ ко всем.Еще один уровень поиска в каталоге.

Get-ChildItem -Directory -Path 'C:\Users\*\*upload*' |
    ForEach-Object {
        Get-ChildItem -File -Path $_.FullName |
            ForEach-Object {
                Move-Item -Path $_.FullName -Destination $(Split-Path -Parent $_.PSParentPath) -WhatIf
            }
    }
...