Добрый день! Есть задание sql сервера, выполняется код powershell:

```1c
    $Date = (Get-Date).Date
    $Destination = "E:\Backup"
    $Departure = "D:\MSSQL\Backup"
    $Catalogs = Get-ChildItem -Path "$Departure" | Where-Object { $_.PSIsContainer }
    foreach ($Catalog in $Catalogs)
    {
    if(!(Test-Path "$Destination\$Catalog")) { New-Item -Path "$Destination\$Catalog" -ItemType Directory } # Создание подкаталогов
    Get-ChildItem -Path "$Departure\$Catalog" —Filter *.bak -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime.Date -eq $Date} | Copy-Item -Destination "$Destination\$Catalog" -Force # копирование бэкапов
    }
```

если его выполнять через задание SQL - вылазит ошибка
Выполняется от имени пользователя: NT Service\SQLSERVERAGENT.На шаге задания произошла ошибка в строке 8 скрипта PowerShell. Соответствующая строка: " Get-ChildItem -Path "$Departure\$Catalog" -Filter *.bak -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime.Date -eq $Date} | Copy-Item -Destination "$Destination\$Catalog" -Force". Исправьте скрипт и заново внесите задание в расписание. Сведения об ошибке, возвращенные PowerShell: "Недопустимый путь: "E:\Backup\BUH_......._d". ". Код завершения процесса: -1. Шаг завершился с ошибкой.

Если этот же код запускать из консоли - все отрабатывает. Права на каталоги есть. Если закомментить строку копирования файлов - подкаталоги успешно создаются. Так же, если напрямую написать копирование конретного файла, то агент sql отрабатывает и копирует

```1c
    Copy-Item "D:\MSSQL\Backup\BUH_....._d\BUH_.......7597418.bak" -Destination "E:\Backup\" -Force
```

Кто подскажет в чем дело? Или как еще можно заставить SQL после создания бэкапов сразу же копировать их во вне?
---
Отвечу сам же на свой вопрос:

выбираем тип шага CMDEXEC

```1c
    cmd /C (ROBOCOPY "ПУТЬОТКУДА" "ПУТЬКУДА" *.bak /S /Z /MAXAGE:1 /R:1 /W:10 /XC /XX) ^& IF %ERRORLEVEL% LSS 8 EXIT /B 0
```
---
"Или как еще можно заставить SQL после создания бэкапов сразу же копировать их во вне?"

- Создаете план обслуживания с несколькими шагами (в зависимости от того, что помимо бэкапа нужно делать). Вариант для бэкап+копирование во вне:
Шаг 1: Бэкап (Либо скриптом чере execute TSQL либо через конструктор);
Шаг 2: execute TSQL примерно следующего содержания:
"-- <включаем использование xp_cmdshell в среде SQL. Если уже включено и выключать не нужно - можно пропустить>
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
-- enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
-- hide advanced options
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
-- ... <включаем использование xp_cmdshell в среде SQL. Если уже включено и выключать не нужно - можно пропустить>
-- скрипт по копированию/ выполнению чего угодно еще
exec xp_cmdshell 'call "script_path/script.bat"'
GO"
---
Хотелось бы без "xp_cmdshell=1" и без использования внешних файлов

(3) с правами все ОК, явное указание файла копирования через powershell в задании отрабатывает агентом корректно.

```1c
    Copy-Item "D:\MSSQL\Backup\BUH_....._d\BUH_.......7597418.bak" -Destination "E:\Backup\" -Force
```

(4) У Нас не экспресс, но мне не известно таких механизмов, где бэкап пишется 2 места зеркально, а не 1 файл бить на 2 части по разным путям. (вариант делать 2 раза бэкап не рассматривается)

(5) Через создание нового шага мне не понравилось, т.е. если редактировать план обслуживания - эти лишние шаги удаляются, решил просто сделать отдельное задание и прикрепил его в основное. А батник из вне тоже не очень хочется запускать по той причине, что его могут подменить или затереть код внутри, или самого затереть, или еще что..
---
Раз копирование идёт на другую машину, а выполнение скрипта от локальной учётки NT Service\SQLSERVERAGENT, то как вариант можно запускать агента под доменной учёткой, которая будет видна и SQL серверу и серверу, куда делается копия бекапа. Ну и про права на запись в каталог этой доменной учётке не забыть дать.
---
А еще лучше не копировать бэкапы, а сразу создавать необходимое количество зеркальных бекапов в нужные папки, если у вас не экспресс конечно
---
Сталкивался с таким вопросом, решить через powershell так и не удалось, в итоге сделал список шагов заданий : первыми заданиями создаем backup в каталог-темп, последним вызываем bat-ник, в котором прописано: создание новых папок, сжатия в архив bak-ов, и последующим перемещением в папки.
---
Отвечу сам же на свой вопрос:

выбираем тип шага CMDEXEC

```1c
    cmd /C (ROBOCOPY "ПУТЬОТКУДА" "ПУТЬКУДА" *.bak /S /Z /MAXAGE:1 /R:1 /W:10 /XC /XX) ^& IF %ERRORLEVEL% LSS 8 EXIT /B 0
```
---
Некропост, но истины ради
В начало скрипта powershell добавить строку "cd c:"