【问题标题】:Recursively move folders/files within subfolders to its parent递归地将子文件夹中的文件夹/文件移动到其父文件夹
【发布时间】:2018-10-16 00:22:05
【问题描述】:

我有一个高级文件夹(称为“级别 0”),其中包含大约一百个子文件夹(“级别 1”),这些子文件夹中包含较低级别的子文件夹和文件(“级别 2”)。我需要将每个文件和文件夹从“级别 2”动态移动到其级别 1 子文件夹(或相对而言 - 它的父级)。

为了更好地可视化:

主文件夹 ├ 父文件夹 1 │ ├─ 子文件夹A │ │ ├─ 档案A │ │ └─ 档案B │ ├─ 子文件夹 B │ │ ├─ 档案C │ │ └─ D档 │ ├─ 档案E │ └─ F档 . . ...许多文件夹更多... . └─ 父文件夹 134 ├─ 子文件夹 CS │ ├─ 档案AGF │ └─ 档案 ARH ├─ 档案ROQ └─ 档案 JGL

我需要从其父文件夹中的任何子文件夹的内容中移动所有内容。如上,您可以看到父文件夹中可能已经有一些文件(例如文件 E、F),它们应该保留。

目标:

主文件夹 ├─ 父文件夹 1 │ ├─ 档案A │ ├─ 档案B │ ├─ 档案C │ ├─ 档案D │ ├─ 档案E │ └─ F档 ├─ 父文件夹 119 │ ├─ 档案AZA │ ├─ 档案AZB │ ├─ 档案AZC │ └─ 档案AZD ... 等等

这里的挑战是在主文件夹下有超过一百个这样的父文件夹,并且都有不同的名称。父文件夹中的子文件夹也有不同的名称。

我尝试使用 Get-ChildItem 来解决这个问题,然后使用“ForEach”尝试将子项(即文件夹)分配为变量,然后执行另一个 Get-ChildItem 递归并将所有内容移动到父项,但我'无处可去,如果有任何动作,它似乎是指回 C:\Windows\ 文件夹。

注意[对不起,更正Not*]字面代码,但方法,我正在考虑:

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

【问题讨论】:

  • 您已经有了正确的想法,尽管您的代码示例有点不完整(请始终发布minimal reproducible example)。您的问题是,当您需要 $parent 作为文件夹的完整路径时,您设置了 $parent = $_。将该行更改为$parent = $_.FullName,您的代码应该可以工作。

标签: powershell directory move parent relative-path


【解决方案1】:

我确实试着为你做点什么。这会将所有内容从 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
}

【讨论】:

  • 我在家里(非域计算机)试过这个,它似乎工作正常。但是,在办公室中使用一些主文件夹内容的副本运行它并放置在我自己的工作站上,它似乎失败了,并且正在将数据从当前驱动器的根目录拉到父文件夹。请参阅下一条评论中的以下代码。
  • Move-item :源路径和目标路径必须不同。在 line:6 char:5 + Move-item -Path $Loc -Destination $dest + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~ + CategoryInfo : WriteError: (D:\Test\Master\...\FOLDER 1:DirectoryInfo) [Move-Item], IOException + FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand移动项:拒绝访问路径“D:\OneNote”。在 line:6 char:5 + Move-item -Path $Loc -Destination $dest + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~ + CategoryInfo : WriteError:
【解决方案2】:

这应该做你想做的事。但是,如果文件名已被使用,它不会将任何具有相同文件名的文件移动到父文件夹。

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

希望对你有用。

【讨论】:

  • 我已经尝试过了,但不起作用,因为目标是包含所有“父”子文件夹的顶级“主”文件夹。我需要将所有文件递归到父文件夹下,才能移动到父文件夹。
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2015-03-01
相关资源
最近更新 更多