powershell 使用Move-Item的脚本:“找不到部分路径”(脚本调试)

iswrvxsc  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(190)

我试图创建一个脚本,它将找到所有与字符串匹配的文件,并在重新创建文件夹结构时移动它们,如果已经存在同名文件,则重命名它们。问题是,我得到了可怕的“无法找到路径的一部分”错误。我已经找到了各种解决方案,但我想有更好的/“正确”的方法,我想看看我错在哪里。下面是我的:

$sourceDir = "E:\Folder1"
$targetDir = "E:\Deep Storage\Folder1"
$search = "*readme.txt*"

Get-ChildItem -Path $sourceDir -Filter $search -Recurse | ForEach-Object {
    $relativePath = $_.FullName.Substring($sourceDir.Length)
    $nextName = Join-Path -Path $targetDir -ChildPath $relativePath

    $num = 1
    while(Test-Path -Path $nextName)
    {
       $nextName = Join-Path $targetDir ($relativePath + "_$num" + $_.Extension)    
       $num += 1   
    }

    $_ | Move-Item -Destination $nextName -Force -Verbose
}

我的解决方法是首先运行以下命令:

robocopy $sourceDir $targetDir /e /xf *.*

我知道如果目标文件夹不存在,Move-Item会有问题,但我不知道如何告诉Powershell在必要时创建目标目录。我的解决方法是使用Robocopy从源目录重新创建目录结构,以使Move-Item满意。问题是,Robocopy路径需要很长时间。
我有另一个专门创建文件夹的脚本,所以这可能是答案,但我不确定如何将其与我已有的代码混合:

If(!(test-path $targetDir))
{
      New-Item -ItemType Directory -Force -Path $targetDir
}

有没有更好的办法?

oknrviil

oknrviil1#

未经测试,但这应该让你接近。我省略了编号,因为只有当来自多个位置的项目被移动/复制到一个位置,并且有可能出现“...已经存在...”错误时,才需要编号。

$sourceDir       = "E:\Folder1"
$targetRoot      = "E:\Deep Storage\Folder1"
$search          = "*readme.txt*"

$relPathOffSet   = $sourceDir.Length
Get-ChildItem -Path $sourceDir -Filter $search -Recurse | ForEach {
    $TargetPath  = Join-Path $targetRoot $_.FullName.SubString($relPathOffSet)
    $targetDir   = Split-Path $TargetPath
    If ( ! ( Test-Path($targetDir) ))
    {
         mkdir $targetDir -Force
    }
    $_ | Move-Item -Destination $TargetPath
}

相关问题