Я согласен, что цикл GOTO опасен - ошибка может привести к тому, что цикл будет длиться вечно, что совсем не хорошо для запланированной задачи.
Для подобных задач я склонен использовать инструмент Resource Kit под названием Robocopy , отчасти потому, что он быстрый, но также и потому, что он надежный. Я обычно устанавливаю 3-5 попыток (опция /r:3
) с 10-секундной паузой, если файл не готов (/w:10
), и затем регистрирую ошибки, чтобы я мог их просмотреть (/log:...
) , Очень кстати. Вот полный список параметров , которые помогут вам выбрать именно то, что вам нужно скопировать.
Возможно, я немного поспешил с первым ответом. Небольшой трюк с переименованием может быть интегрирован в ваш скрипт и, вероятно, будет работать нормально:
...
for /f "delims=" %%A in ('dir C:\Temp\*.ps /b') do (
:TestFile
ren C:\Temp\%%A.ps C:\Temp\%%A.ps
if errorlevel 0 goto Continue
sleep 5
goto TestFile
:Continue
"C:\Program Files\7-Zip\cmdline\7za.exe" a -tzip -mx9 "C:\temp\Zip\%%A.zip" "C:\temp\%%A"
move "C:\temp\%%A" "C:\Temp\Archive"
)
...
Или, если вы хотите использовать Robocopy, вы можете сначала переместить файл, а затем выполнить архивирование. (Пока вы перемещаете файл в тот же раздел - в вашем примере он находится из C: \ TEMP в C: \ TEMP \ Archived - нет задержки.) Таким образом, Robocopy будет делать, пока файл не будет готово, тогда пусть ваш сценарий продолжит молнию. Вот пример:
...
for /f "delims=" %%A in ('dir C:\Temp\*.ps /b') do (
robocopy C:\Temp C:\Temp\Archive\ %%A.ps /mov /r:100 /w:5 /log+:copylog.txt
"C:\Program Files\7-Zip\cmdline\7za.exe" a -tzip -mx9 "C:\temp\Archive\%%A.zip" "C:\temp\Archive\%%A.ps"
)
...