Powershell移动项目不会从源代码中删除某些3D png文件

问题描述 投票:1回答:1

我有一个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

enter image description here

在此处输入图像描述

enter image description here

enter image description here

powershell png move-semantics
1个回答
0
投票

您正在为/R:3使用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
© www.soinside.com 2019 - 2024. All rights reserved.