Powershell 仅针对包含特定字符串的文件夹名称移动子目录中的项目

Powershell move items in subdirectories only for a folder name that contains a certain string

假设有一堆包含不同子文件夹的文件夹。下面的示例有一个用户 1 的根文件夹和该文件夹下的 3 个子目录。如何创建一个循环脚本,将项目从仅包含字符串 "upload" 的子目录向上移动到用户文件夹。

->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(2019 年 3 月 21 日) 需要明确的是,他的是一个 SFTP 程序。 C:/usrs 中有一个用户文件夹列表,我想将文件从 c:/usrs/user1/user1upload 移动到 C:/usrs/user1

这使用 PowerShell 5 来指定 -Directory。如果您还没有使用 PowerShell 5,可以通过不同的方式完成。

搜索目录,然后在目录中搜索文件。

当您确信文件将被正确移动时,从 Move-Item cmdlet 中删除 -WhatIf

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

我以为您在 "user's" 目录中,您通常无权访问所有目录。多一级目录搜索。

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
            }
    }