Powershell move-item 不会从源中删除一些 3D png 文件

Powershell move-item does not remove some 3D png files from source

我有一个 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(文件分配 table)被更改。当交叉共享时,必须移动实际的文件数据,所以这些文件有一些有趣的东西可以防止这种情况发生。但如上所述,如果我第二次 运行 脚本,则剩余的文件可以正常复制和删除。所以这有点无法解释。

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

查看下面的代码示例,以及前后源文件夹结构的一些屏幕截图。

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

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

$FinalFolder_M = '\3ipbg-fs-p01\patient specific mfgShape_AutoCreate\Auto_Job_Create_Test\Inbox_Manual_Jobs'
$FinalFolder_M_robo = '\3ipbg-fs-p01\patient specific mfgShape_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) 在循环代码中,它检查源文件夹是否存在,如果是,它会继续 $retriesSleep 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