首页 > 解决方案 > Powershell move-item 不会从源中删除一些 3D png 文件

问题描述

我有一个 Powershell 脚本发出 Move-Item 命令以将一些 3D CAD 目录和子目录从一个网络共享移动到另一个网络共享。每天大约 300 个父文件夹。我遇到了最奇怪的问题。所有父文件夹都可以很好地复制到目标,但是 300 个对象中的大约 10 个没有从源中删除。似乎任何包含 png 扫描文件类型的子目录都不会从源中删除;它复制得很好,只是不会从源中删除。-verbose 日志输出中没有报告错误。文件大小不大,每个<50MB。进行一些测试时,我还注意到,如果我运行一次脚本,就会出现问题,但是如果我再次运行脚本而不做任何更改,它会移动最初运行时没有移动的剩余对象。另一个观察结果是,如果我在源和目标位于同一共享上的情况下运行脚本,则不会出现问题。仅当源和目标位于不同的共享上时才会出现此问题。使用 5.1 和 4.0 版本时同样的问题。

我还尝试使用我自己创建的一些简单的 png 文件,只需将 jpg 屏幕打印保存为 png,并且这些 png 文件可以很好地复制和删除。所以这些 3D CAD png 文件有一些特别之处。我什至尝试复制父文件夹以共享以确保没有或没有程序锁定原始文件,并且问题仍然存在。

我已经成功地用 robocopy 命令替换了 move-item 命令,并且它运行良好,所以我可以使用 robocopy 来解决我的问题,但我想弄清楚为什么 move-item 命令会出现这个问题。我唯一的理论是,如果在同一个共享上,实际上没有数据被移动,只有对文件的引用,即指针,即 FAT(文件分配表)被更改。当交叉共享时,必须移动实际的文件数据,因此这些文件有些有趣,可以防止这种情况发生。但如上所述,如果我第二次运行脚本,剩余的文件会复制并删除。所以这有点无法解释。

只是想知道是否有人有任何想法。

请参阅下面的代码示例,以及之前和之后的源文件夹结构的一些屏幕打印。

$sLogPath = 'C:\PowerShell_scripts\test\robocopy_test.log'

$StagingFolder = '\\3ipbg-fs-p01\PSP_Inbound\Test\3Shape_Auto_Create\Suspense\test_case_01'

$FinalFolder_M = '\\3ipbg-fs-p01\patient specific mfg\3Shape_AutoCreate\Auto_Job_Create_Test\Inbox_Manual_Jobs'
$FinalFolder_M_robo = '\\3ipbg-fs-p01\patient specific mfg\3Shape_AutoCreate\Auto_Job_Create_Test\Inbox_Manual_Jobs\test_case_01'

Move-Item -LiteralPath $StagingFolder $FinalFolder_M -Verbose -Force

robocopy $StagingFolder $FinalFolder_M_robo /R:3 /W:3 /E /B /J /MIR /MOVE /LOG+:$sLogPath

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

标签: powershellpngmove-semantics

解决方案


您正在使用/R:3参数 for robocopy,这意味着如果出现错误,它将重试移动文件夹最多 3 次。我不知道 PowerShell 中有这样的功能,但您可以轻松地为此编写一个小型实用程序函数。

假设:

1) 在循环代码中,它检查源文件夹是否存在,如果是,它会持续最多2 秒的$retries时间Sleep

Function Custom-Move{
    param( [string]$source, [string]$destination, [int]$retries)

    $i=0
    while($i -ne $retries){
     Move-Item -LiteralPath $source -Destination $destination -Verbose -Force -ErrorAction SilentlyContinue

     #test if the folder exist, if not meaning that the folder was moved.
     if(-not (Test-Path $source)) {break} 

     $i++
     Start-Sleep 2
    }
}

用法:

Custom-Move $StagingFolder $FinalFolder_M 5

推荐阅读