Назад | Перейти на главную страницу

SQL Server: работа с шагом PowerShell с помощью robocopy не заканчивается

У меня есть многоэтапное задание SQL, которое в основном генерирует журналы транзакций, а затем копирует их с помощью robocopy. Шаги Robocopy относятся к типу PowerShell и выглядят следующим образом:

$src=(Invoke-Sqlcmd -Database 'msdb' -Query "select last_backup_file from log_shipping_monitor_primary where primary_database = 'Dummy'")['last_backup_file']
$command="robocopy"
$arguments=([System.IO.Path]::GetDirectoryName($src)) + " \\server\share " + ([System.IO.Path]::GetFileName($src)) + " /NP"
[System.Diagnostics.Process]::Start($command, $arguments)

Проблема именно с этим шагом заключается в том, что robocopy никогда не завершается, процесс остается активным даже после успешного выполнения задания. Если тот же код, приведенный выше, запускается из консоли SQL PowerShell (или консоли PowerShell, отличной от SQL, с загруженными оснастками SQL), он работает правильно, ни один потерянный процесс не остается в живых.

Примечание: вы можете задаться вопросом, почему я запускаю robocopy через Process.Start (). Это подводит меня к первой проблеме: когда сценарий выглядит следующим образом (что я пробовал перед сценарием выше), выполнение задания никогда не останавливается:

$src=(Invoke-Sqlcmd -Database 'msdb' -Query "select last_backup_file from log_shipping_monitor_primary where primary_database = 'Dummy'")['last_backup_file']
robocopy ([System.IO.Path]::GetDirectoryName($src)) \\server\share ([System.IO.Path]::GetFileName($src)) /NP

Примечание (2): я читал Исправление robocopy для заданий SQL но этот вопрос не имеет отношения.

Проблема заключалась просто в том, что robocopy нужен этот параметр: «/ R: 0».

Действительно странно, поскольку это означает, что нельзя повторять операцию. Но с первого раза операция прошла успешно. И снова из консоли PowerShell все заработало правильно.