使用 move-item 递归移动包含具有特定文本的文件的文件夹时出现访问被拒绝错误

问题描述 投票:0回答:1

我对此摸不着头脑,还没有找到任何可以让它发挥作用的东西。

我有一个具有 root1\yyyy\mm\dd\hh\uniqueid 结构的文件夹树,需要根据每个文件夹中特定 json 文件中的内容将 uniqueid 子文件夹移动到 root2\yyyy\mm\dd\hh 树中唯一ID文件夹

经过多次搜索,我得到了下面的代码,它正确识别了我需要移动的文件夹,并创建了 root2\yyyy\mm\dd\hh 文件夹来保存移动的 uniqueid 文件夹,但它给出了访问被拒绝的错误尝试执行 move cmdlet

$root1 = My-Current-Root-Folder
$root2 = My-New-Root-Folder
(Get-ChildItem -Literalpath $root1 -Recurse -Filter *.json) | Select-String -Pattern content-I-am-looking-for | ForEach-Object {
    $folderToMove = (Split-Path -Parent $_.Path)
    $destinationFolder = $folderToMove.Substring(0, $folderToMove.Length - 33).Replace($root1 , $root2)
    write-host $folderToMove #This correctly displays the source folders I need to move
    write-host $destinationFolder #This correctly displays the root2 folder structure to hold the moved folders
    If(!(Test-Path $destinationFolder)){
       New-Item -Path $destinationFolder -ItemType "directory" #This correctly created the root2 folders for the move
    }

    move-item -path $folderToMove -destination $destinationFolder -Force
}

错误是这样的: move-item : 访问路径 '$root1�3 9 \uniqueid' 被拒绝。

但是,如果我执行 move-item 命令显式指定 uniqueid 文件夹之一和关联的 root2\yyyy\mm\dd\hh 目的地,则该文件夹将毫无问题地移动。

非常感谢所有建议

尝试将源和目标用双引号括起来,以防需要,并在源和目标上指定 [string],但这只会给出不同的错误(找不到驱动器 F)

powershell
1个回答
0
投票

我改编了这篇post的答案。

$sourceDir = 'My-Current-Root-Folder'
$targetDir = 'My-New-Root-Folder'

Get-ChildItem $sourceDir -filter "*" -recurse | ForEach-Object {
    $targetFile = $targetDir + $_.FullName.SubString($sourceDir.Length)

    If ( $_.PSIsContainer -eq $True ) {
        If (-not( Test-Path $targetFile )) {
            New-Item -ItemType Directory -Path $targetFile -Force
        }
    } else {
        Move-Item $_.FullName -destination $targetFile
    }
}

确实很慢,但很有效。

© www.soinside.com 2019 - 2024. All rights reserved.