【问题标题】:Moving contents of a folder up one level based on folder name根据文件夹名称将文件夹的内容上移一级
【发布时间】:2021-06-29 22:08:36
【问题描述】:

我有一个信息目录,该目录分为文档编号,因此每个包含文档的文件夹都以 DOC-######-NameOfDocument 开头。我要做的事情是创建一个 PowerShell 脚本,它将在目录中搜索具有指定文档编号的任何文件夹,然后获取该文件夹的内容,将其上移一级,然后删除原始文件夹(现在应该为空)。

下面是我得到的最接近预期结果的结果。

$Path = "filepath"
$Folders = Get-ChildItem -Filter "DOC-#####*" -Recurse -Name -Path $Path
$companyID = "######"


    foreach ($Folder in $Folders){
        $filepath = $Path + $Folder
        $Files = Get-ChildItem -Path $filepath

        $imagesourc = $filepath + $companyID
        $imageDest = $filepath.Substring(0, $filepath.LastIndexOf('\'))

            if (Test-Path -Path $imagesourc){
                Copy-Item -Path $imagesourc -Destination $imageDest -Recurse
            }
        

        foreach ($File in $Files){
        
            $Parent_Directory = Split-Path -Path $File.FullName
            $Destination_Path = $filepath.Substring(0, $filepath.LastIndexOf('\'))

            Copy-Item -Path $File.FullName -Destination $Destination_Path -Recurse
               if ($null -eq (Get-ChildItem -Path $Parent_Directory)) {  
            }
        }
        Remove-Item $filepath -Recurse
    }

这可以满足我的需要,但无论出于何种原因,我无法 Devine,它不适用于 .HTM 文件。我要移动的大多数文件都是 .html 和 .htm 文件,所以我还需要让它与 .htm 一起使用。带有.HTM的文件不会移动,文件夹也不会被删除,这至少是好的。

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/51346965/…
  • 这个问题的代码是我开始的地方,我已将以下代码添加到第 3 行。 | Move-Item -Destination { $_.Directory.Parent.FullName } 如果它正在查看的文件夹中只有文件,我现在将它放到可以工作的位置,但是如果有子文件夹,它们将不会移动并且会崩溃并关闭 powershell 窗口。
  • 通过一些额外的测试,崩溃的错误是目标为 NULL。如果在目标文件夹中没有找到子文件夹,则使用相同的代码。
  • 我根据进一步的研究和测试对代码进行了调整。现在主要工作但无法移动 .htm 文件。

标签: powershell


【解决方案1】:

试试这个:

$ErrorActionPreference = 'Stop'
$fileNumber = '1234'
$initialFolder = 'X:\path\to\folders'

$folders = Get-ChildItem -Path $initialFolder -Filter DOC-$fileNumber* -Force -Directory -Recurse

foreach($folder in $folders)
{
    try
    {
        Move-Item $folder\* -Destination $folder.Parent.FullName
        Remove-Item $folder
    }
    catch [System.IO.IOException]
    {
        @(
            "$_".Trim()
            "File FullName: {0}" -f $_.TargetObject
            "Destination Folder: {0}" -f $folder.Parent.FullName
        ) | Out-String | Write-Warning
    }
    catch
    {
        Write-Warning $_
    }
}

重要提示:

  • Move-Item $folder\* 将递归移动所有文件夹内容。如果$folder 内有文件夹,这些文件夹也会被移动,如果您要定位 内有文件的文件夹,则应在此 cmdlet 前添加 if 条件。
  • Try {...} Catch {...}主要是处理文件冲突的,如果父文件夹中已经存在同名文件,它会通知你,它不会被移动,也不会被删除。
  • -Filter DOC-$fileNumber* 将捕获以$fileNumber 中的数字命名的所有文件夹,但是请小心,因为它可能会捕获您可能不打算删除的文件夹。
    • 示例:如果您想获取所有包含数字 1234 的文件夹(DOC-12345-NameOfDocumentDOC-12346-NameOfDocument、...)但您不想想要捕获 DOC-12347-NameOfDocument 然后你应该微调过滤器。或者您可以添加 -Exclude 参数。
  • -Force & -Directory 获取隐藏文件夹并定位only文件夹。

【讨论】:

  • 所以上面的脚本在我运行它的目录中除了 1 个文件夹之外都可以工作。不起作用的文件夹似乎失败了,因为子文件夹与文件夹的子文件夹同名已经处理的。它有那个子文件夹已经存在并且失败的错误。对于那个文件夹,它也没有继续过去。
  • @Patrick 好吧,是的,这是意料之中的,这就是为什么我添加了 try {...} catch {...} 语句,现在是这样,如果存在文件/文件夹冲突,它将停止处理文件夹,你需要添加一个if语句来处理/决定当有文件/文件夹冲突时该怎么做。
猜你喜欢
  • 1970-01-01
  • 2018-12-23
  • 2021-11-06
  • 2013-01-15
  • 2020-09-21
  • 2021-12-26
  • 2021-05-24
  • 2017-06-07
  • 1970-01-01
相关资源
最近更新 更多