Войти

Показать полную графическую версию : [решено] Синтаксис cmd для CmdShell (MS SQL)


cons74
26-12-2018, 09:13
Есть такой bat
set From=H:\MSSQL\Backup\Daily\*.bak
set To=H:\MSSQL\Backup\Month
xcopy "%"From"%" /y /S /I "%"To"%"
при выполнении из cmd - все хорошо.
Но при попытке поместить данный код в CmdShell (MS SQL) - не работает. Ситуацию осложняет ограниченный вывод ошибок. Т.е. ошибок не выводится, но и копирование не выполняется.
На данный момент дошел до того, что надо склеить строки в одну через &&:
set From=H:\MSSQL\Backup\Daily\*.bak && set To=H:\MSSQL\Backup\Month && xcopy "%"From"%" /y /S /I "%"To"%"
теперь уже что-то начало работать, вернее, появилась ошибка "File not found - %From%"

Iska
26-12-2018, 09:21
при выполнении из cmd - все хорошо. »
Вообще-то — не всё хорошо. Выделенное:
xcopy "%"From"%" /y /S /I "%"To"%" »
— совершенно лишнее. Это раз. Второе — порядок должен быть таким:
xcopy.exe источник [целевой_объект] [параметры]

На данный момент дошел до того, что надо склеить строки в одну через &&: »
Неправильно. Объединение команд — оператор «&», а оператор «&&» означает другое — «выполнить последующую команду, если предыдущая вернула нулевой код возврата».

cons74
26-12-2018, 09:52
Если под "совершенно лишнее" вы имеете в виду что можно и не указывать переменные - то я отвечу что мне надо данный код указать в 2х местах для разных папок. А еще не указал - но есть - параметр /D, т.е. полный код который хочу выполнить:
set From= H:\MSSQL\Backup\Daily2\*.bak
set To= H:\MSSQL\Backup\Month
set Condition= /D:%date:~3,2%-%date:~0,2%-%date:~6,4%
xcopy %From% %To% %Condition% /y /S /I

В любом случае замена && на & не решает проблему "File not found - %From%"

Iska
26-12-2018, 10:57
Если под "совершенно лишнее" вы имеете в виду »
Под «совершенно лишнее» я имел в виду только выделенное и ничего более. Выделенные двойные кавычки в процитированном мною. Так понятнее?

т.е. полный код который хочу выполнить: »
Как минимум, уберите пробельные символы (пробелы и табуляцию) между знаком равенства и значением, т.е.:
set From=H:\MSSQL\Backup\Daily2\*.bak
set To=H:\MSSQL\Backup\Month
set Condition=/d:%date:~3,2%-%date:~0,2%-%date:~6,4%
xcopy.exe "%From%" "%To%" %Condition% /y /s /i

cons74
26-12-2018, 14:00
Да это просто с блокнота копировал, пробелов в указанной выше строке set From=H:\MSSQL\Backup\Daily\*.bak & set To=H:\MSSQL\Backup\Month & xcopy %From% /y /S /I %To%, которую подставляю в cmdshell - нет

Iska
26-12-2018, 16:59
cons74, с командами, объединёнными по &, есть одна проблема — раскрытие переменных окружения в них происходит в момент начала исполнения всей программной строки. То есть, Ваше:
set From=H:\MSSQL\Backup\Daily\*.bak & set To=H:\MSSQL\Backup\Month & xcopy %From% /y /S /I %To%
при исполнении примет вид:
set From=H:\MSSQL\Backup\Daily\*.bak & set To=H:\MSSQL\Backup\Month & xcopy /y /S /I
Можете попробовать так (не проверялось):
set "From=H:\MSSQL\Backup\Daily2\*.bak" & set "To=H:\MSSQL\Backup\Month" & call xcopy.exe "%%From%%" "%%To%%" /y /s /i

YuS_2
26-12-2018, 17:06
set From=H:\MSSQL\Backup\Daily\*.bak & set To=H:\MSSQL\Backup\Month & xcopy %From% /y /S /I %To% »
Если представить такую строку в несколько строк с отдельными командами, то выглядеть она будет так:
(
set From=H:\MSSQL\Backup\Daily\*.bak
set To=H:\MSSQL\Backup\Month
xcopy %From% /y /S /I %To%
)
а внутри оператора "скобки", переменные раскрываются по-другому, требуется отложенное раскрытие:
setlocal enabledelayedexpansion
(
set "From=H:\MSSQL\Backup\Daily\*.bak"
set "To=H:\MSSQL\Backup\Month"
xcopy !From! !To! /y /S /I
)
то бишь:
setlocal enabledelayedexpansion
set "From=H:\MSSQL\Backup\Daily\*.bak"&set "To=H:\MSSQL\Backup\Month"&xcopy !From! !To! /y /S /I

Iska
26-12-2018, 17:25
YuS_2, так ему одна строка нужна, а не две :). Потому — либо задание умолчания в реестре, либо параметр /V:ON для %comspec%.

cons74
26-12-2018, 18:12
Iska, File not found - *.bak%

Убрал двойные % - заработало:
set "From=H:\MSSQL\Backup\Daily\*.bak" & set "To=H:\MSSQL\Backup\Month" & call xcopy.exe "%From%" "%To%" /y /s /i
осталось добавить установку переменной
set Condition=/d:%date:~3,2%-%date:~0,2%-%date:~6,4%

Добил
set From=H:\MSSQL\Backup\Daily\*.bak & set To=H:\MSSQL\Backup\Month & set Condition=/d:%date:~3,2%-%date:~0,2%-%date:~6,4% & call xcopy.exe %From% %To% %Condition% /y /s /i
Получается надо было лишь добавить call (CALL will expand any variables passed on the same line. https://ss64.com/nt/call.html)




© OSzone.net 2001-2012