我有一个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
在此处输入图像描述
您正在为/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