我对此摸不着头脑,还没有找到任何可以让它发挥作用的东西。
我有一个具有 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)
我改编了这篇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
}
}
确实很慢,但很有效。