Элемент перемещения Powershell не удаляет некоторые 3D-файлы PNG из исходного кода. - PullRequest
2 голосов
/ 23 октября 2019

У меня есть скрипт Powershell, выдающий команду Move-Item для перемещения некоторых каталогов и подкаталогов 3D CAD из одного сетевого ресурса в другой. Около 300 родительских папок в день. У меня самая странная проблема. Все родительские папки просто копируются в место назначения, но около 10 из 300 объектов не удаляются из источника. Кажется, что любой подкаталог, содержащий тип файла сканирования png, не будет удален из источника;он копирует нормально, просто не удаляет из источника. В выводе журнала -verbose об ошибках не сообщается. Размеры файлов не большие, <50 МБ каждый. Проведя некоторое тестирование, я также заметил, что если я запускаю сценарий один раз, возникает проблема, но если я снова запускаю сценарий без изменений, он перемещает оставшиеся объекты, которые он не перемещал при первоначальном запуске. Другое наблюдение состоит в том, что если я запускаю сценарий, в котором источник и место назначения находятся в одной папке, проблема не возникает. Проблема возникает только тогда, когда источник и место назначения находятся на разных общих ресурсах. Та же проблема с обеими версиями 5.1 и 4.0. </p>

Я также попытался использовать несколько простых файлов png, которые я создал сам, просто сохранив jpg-экран в виде png, и эти файлы png скопировали и удалили нормально. Что-то особенное в этих файлах 3D CAD png. Я даже попытался скопировать из родительской папки общий доступ, чтобы убедиться, что ни одна или никакая программа не блокирует исходные файлы, и проблема все еще возникает.

Я успешно заменил команду move-item на robocopyкоманда, и она отлично работает, так что я мог бы использовать robocopy для решения моей проблемы, но я хочу выяснить, почему команда move-item имеет эту проблему. Моя единственная теория заключается в том, что если на одном и том же ресурсе данные не перемещаются, то изменяется только ссылка на файл, то есть указатель, то есть FAT (таблица размещения файлов). При пересечении общих файлов необходимо перемещать данные самого файла, поэтому в этих файлах есть что-то смешное, что предотвращает это. Но, как указано выше, если я запускаю скрипт 2 раза, остальные файлы копируются и удаляются нормально. Так что это оставляет немного необъяснимым.

Просто интересно, есть ли у кого-нибудь какие-либо идеи.

См. Примеры кода ниже, а также некоторые снимки экрана со структурой исходной папки до и после.

$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

1 Ответ

1 голос
/ 23 октября 2019

Вы используете параметр /R:3 для robocopy, что означает, что он пытается переместить папку до 3 раз, если присутствует ошибка. Я не знаю о такой функциональности в PowerShell, но вы могли бы легко написать для этого небольшую служебную функцию.

Допущения:

1) В коде цикла он проверяет, существует ли исходная папка. , если Да, это продолжается до $retries раз с Sleep из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...