Powershell移动项不会从源中删除某些三维png文件

Powershell移动项不会从源中删除某些三维png文件,powershell,png,move-semantics,Powershell,Png,Move Semantics,我有一个Powershell脚本,它发出Move Item命令,将一些3D CAD目录和子目录从一个网络共享移动到另一个网络共享。每天大约有300个父文件夹。我遇到了最奇怪的问题。所有父文件夹都可以复制到目标,但是300个对象中有10个没有从源中删除。似乎任何包含png扫描文件类型的子目录都不会从源文件中删除;它复制得很好,只是不从源代码中删除。在-verbose日志输出中未报告任何错误。文件大小不大,每个文件小于50MB。在做一些测试时,我还注意到,如果我运行脚本一次,问题就会出现,但是如果我

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

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

我已经成功地将move item命令替换为robocopy命令,它工作得非常好,因此我可以使用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

在此处输入图像描述


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

假设:

1) 在循环代码中,它检查源文件夹是否存在,如果存在,它将继续执行
$retries
次,其中
睡眠时间为2秒

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

@EyIM,非常感谢您的重试逻辑。它工作得很好。我添加了一个日志输出行来显示进行了多少次尝试,果然,剩余的对象在第二次尝试时被移动了。我真希望我能找到第一次尝试没有完成的原因。我相信机器人技术在第一次尝试时有效,而不是在任何一次重试时有效。答案被接受。如果有人阅读本文,对第一次尝试未能完成的根本原因有更多的了解,请随时回复。