Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Синтаксис cmd для CmdShell (MS SQL)

Ответить
Настройки темы
CMD/BAT - [решено] Синтаксис cmd для CmdShell (MS SQL)

Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


Есть такой 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%"

Отправлено: 09:13, 26-12-2018

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата cons74:
при выполнении из cmd - все хорошо. »
Вообще-то — не всё хорошо. Выделенное:
Цитата cons74:
Код: Выделить весь код
xcopy "%"From"%" /y /S /I "%"To"%"
»
— совершенно лишнее. Это раз. Второе — порядок должен быть таким:
Код: Выделить весь код
xcopy.exe источник [целевой_объект] [параметры]
Цитата cons74:
На данный момент дошел до того, что надо склеить строки в одну через &&: »
Неправильно. Объединение команд — оператор «&», а оператор «&&» означает другое — «выполнить последующую команду, если предыдущая вернула нулевой код возврата».
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:21, 26-12-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


Если под "совершенно лишнее" вы имеете в виду что можно и не указывать переменные - то я отвечу что мне надо данный код указать в 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%"

Отправлено: 09:52, 26-12-2018 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата cons74:
Если под "совершенно лишнее" вы имеете в виду »
Под «совершенно лишнее» я имел в виду только выделенное и ничего более. Выделенные двойные кавычки в процитированном мною. Так понятнее?

Цитата cons74:
т.е. полный код который хочу выполнить: »
Как минимум, уберите пробельные символы (пробелы и табуляцию) между знаком равенства и значением, т.е.:
Код: Выделить весь код
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

Отправлено: 10:57, 26-12-2018 | #4


Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:00, 26-12-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 26-12-2018 | #6


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата 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 %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

-------
scio me nihil scire. Ѫ


Отправлено: 17:06, 26-12-2018 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


YuS_2, так ему одна строка нужна, а не две . Потому — либо задание умолчания в реестре, либо параметр /V:ON для %comspec%.

Отправлено: 17:25, 26-12-2018 | #8


Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


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)

Последний раз редактировалось cons74, 26-12-2018 в 18:40.


Отправлено: 18:12, 26-12-2018 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Синтаксис cmd для CmdShell (MS SQL)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
MSFT SQL Server - Есть ли способ перейти с MS SQL 2005 на MS SQL 2000 elec Программирование и базы данных 10 18-04-2013 12:35
MSFT SQL Server - Ограничение ЦП для MS SQL Rulezzz2 Программирование и базы данных 3 18-04-2013 02:03
MSFT SQL Server - MS SQL Express и MS SQL Standart Negativ Программирование и базы данных 1 25-12-2012 08:12
Использование - MS SQL server cal 2005 для доступа к SQL SRV 2008 xaustov Лицензирование продуктов Microsoft 1 20-01-2012 17:55
MSFT SQL Server - кластеризация MS DTC для SQL toro Программирование и базы данных 7 31-01-2009 20:18




 
Переход