Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Синтаксис cmd для CmdShell (MS SQL) (http://forum.oszone.net/showthread.php?t=338430)

cons74 26-12-2018 09:13 2848317

Синтаксис cmd для CmdShell (MS SQL)
 
Есть такой 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 2848319

Цитата:

Цитата cons74
при выполнении из cmd - все хорошо. »

Вообще-то — не всё хорошо. Выделенное:
Цитата:

Цитата cons74
Код:

xcopy "%"From"%" /y /S /I "%"To"%"
»

— совершенно лишнее. Это раз. Второе — порядок должен быть таким:
Код:

xcopy.exe источник [целевой_объект] [параметры]
Цитата:

Цитата cons74
На данный момент дошел до того, что надо склеить строки в одну через &&: »

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

cons74 26-12-2018 09:52 2848322

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

Цитата:

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


cons74 26-12-2018 14:00 2848376

Да это просто с блокнота копировал, пробелов в указанной выше строке
Код:

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 2848422

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 2848426

Цитата:

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


Iska 26-12-2018 17:25 2848430

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

cons74 26-12-2018 18:12 2848435

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)


Время: 06:26.

Время: 06:26.
© OSzone.net 2001-