Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
212
Guest
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)

Выполняю команду exec xp_cmdshell '@ftp -s:d:\ftp_script 1xx.1xx.0.61' - как проверить, что файл успешно загружен на ftp?
19 май 11, 18:41    [10680523]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
xp_cmdshell без второго параметра возвращает возвращает текстовое сообщение. Анализируйте его.
19 май 11, 18:56    [10680591]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
212
Guest
Prolog
дык, это понятно
Но меня интересует конкретно проверка команды dos ftp
19 май 11, 19:00    [10680596]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
erhterh
Guest
ms command line ftp - слабоват для обработки rc
лучше поискать freeware замену
19 май 11, 19:13    [10680630]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
212
Guest
Начальник требует только использовать ftp.
19 май 11, 19:22    [10680651]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
xp_cmdshell на самом деле возвращает значение переменной окружения errorlevel. Его и анализируйте.
19 май 11, 19:28    [10680674]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
1
Guest
только она не зависит от того успешно загружен файл или нет.
19 май 11, 19:34    [10680691]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
erhterh
Guest
ага,
а если на ftp сервере на папке стоит write only, то никакие выкрутасы не помогут.
раньше был freeware, сейчас не знаю
19 май 11, 20:40    [10680877]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
212
как проверить, что файл успешно загружен на ftp?
Наверное, надо сделать cmd файл, в нём анализировать результат работы ftp и устанавливать errorlevel, который уже ловить на выходе из хр_cmdshell
19 май 11, 21:02    [10680928]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
erhterh
Guest
alexeyvg,

ftp при выходе вернёт 0, независимо от того как завершилась put/mput
19 май 11, 21:14    [10680971]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
erhterh
Guest
а у аналога есть опция "ftps.exe -quiterror ..."
которая решает вопрос
19 май 11, 21:47    [10681088]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
erhterh
alexeyvg,

ftp при выходе вернёт 0, независимо от того как завершилась put/mput
Неужели нет какого то способа понять, успешно завершилось выполнение ftp или нет??? Она что, даже в консоль ничего не выводит, вообще никуда?

Я вот запустил вашу команду, она честно написала:
19 май 11, 22:03    [10681147]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
erhterh
alexeyvg,

ftp при выходе вернёт 0, независимо от того как завершилась put/mput
Неужели нет какого то способа понять, успешно завершилось выполнение ftp или нет??? Она что, даже в консоль ничего не выводит, вообще никуда?

Я вот запустил вашу команду, она честно написала:
Error opening script file ...

Наверное, это можно поймать...
19 май 11, 22:05    [10681153]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
erhterh
Guest
alexeyvg,
поймать можно.
куски кода из давно написанного, но отвергнутого
 var sCmd     = "ftp.exe -A";
  var WshShell = new ActiveXObject("WScript.Shell");
  var oExec    = WshShell.Exec(sCmd);

  oExec.StdIn.WriteLine("open " + FtpServer + " " + FtpPort);
  oExec.StdIn.WriteLine("verbose");
  oExec.StdIn.WriteLine("prompt");
  oExec.StdIn.WriteLine("user " + FtpUser + " " + FtpPassword);
  oExec.StdIn.WriteLine("debug");

  // PUT
  oExec.StdIn.WriteLine("lcd out");
  if (FtpDir != "")
    oExec.StdIn.WriteLine("cd " + FtpDir);
  nFileNames = FileNamesOut.length;
  var fn = FileNamesOut.pop();
  while (fn != undefined) {
    oExec.StdIn.WriteLine("mput " + fn);
    fn = FileNamesOut.pop();
  }

  oExec.StdIn.WriteLine("lcd ..");
 var Input = "";
    if (!oExec.StdOut.AtEndOfStream)
      Input = oExec.StdOut.ReadLine();
    if (!oExec.StdErr.AtEndOfStream)
      Input += oExec.StdErr.ReadLine();

В некоторых случаях выдавал Ок, когда это было не так.
Анализ показал, что полностью удостовериться в передаче утилитой от MS можно только выполнив чтение размера переданного файла с ftp сервера.
Но в случае, когда на сервере стоит write only - не прокатывает.
И потом, нет поддержки sftp, а иногда требовался.
В результате всё быстро переделал на упомянутую утилитку.
Благо весь синтаксис у неё совместим с ftp.exe от MS.
19 май 11, 22:31    [10681262]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
erhterh
alexeyvg,
В некоторых случаях выдавал Ок, когда это было не так.
Анализ показал, что полностью удостовериться в передаче утилитой от MS можно только выполнив чтение размера переданного файла с ftp сервера.
Но в случае, когда на сервере стоит write only - не прокатывает.
И потом, нет поддержки sftp, а иногда требовался.
В результате всё быстро переделал на упомянутую утилитку.
Благо весь синтаксис у неё совместим с ftp.exe от MS.
Да, понятно. Не продумана эта ftp :-(
19 май 11, 22:40    [10681295]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
1
Guest
Пока решил проблему так
 DECLARE @tzip table(id INT IDENTITY, st_output NVARCHAR(MAX))   
SET @sqlCMD='@echo '+@LoginFtp+'>'+@NameFtpFile
   INSERT INTO @tzip 
   EXEC xp_cmdshell @sqlcmd
   SET @sqlCMD='@echo '+@PasswordFtp+'>>'+@NameFtpFile
   INSERT INTO @tzip 
   EXEC xp_cmdshell @sqlcmd
   SET @sqlCMD='@echo '+'binary'+'>>'+@NameFtpFile
   INSERT INTO @tzip 
   EXEC xp_cmdshell @sqlcmd
   SET @sqlCMD='@echo '+'prompt'+'>>'+@NameFtpFile
   INSERT INTO @tzip 
   EXEC xp_cmdshell @sqlcmd
   --SELECT zipfile=@zipfile
   SET @sqlCMD='@echo '+'put '+@zipfile+'>>'+@NameFtpFile
   INSERT INTO @tzip 
   EXEC xp_cmdshell @sqlcmd
   SET @sqlCMD='@echo quit'+'>>'+@NameFtpFile
   INSERT INTO @tzip 
   EXEC xp_cmdshell @sqlcmd
   SET @sqlcmd='@ftp -s:'+@NameFtpFile+' '+@ftp
   DELETE FROM @tzip
   INSERT INTO @tzip 
   EXEC xp_cmdshell @sqlcmd
   print @sqlcmd 
   --SELECT 'ftp', * FROM @tzip ORDER BY ID
   IF NOT EXISTS (SELECT 1 
                  from @tzip z
                    INNER JOIN @tzip z1 ON z.ID+1=z1.ID
                  WHERE z.[st_output] LIKE 'put%' AND z1.[st_output]='quit') 
   BEGIN 
    SET @subject ='Database ['+@DataBaseName+'] was not sended on ftp '+@zipfile; 
    EXEC msdb.dbo.sp_send_dbmail
    @recipients=@recipients,
    @subject=@subject,
    @body=@sqlcmd 
    GOTO MNEXT
   END   

Правильность решения покажет тестирование. В принципе, мне только нужно определить, что файл успешно загружен на ftp. К сожалению, в ms sql возвращается не все, что выдается на экран

Сообщение было отредактировано: 20 май 11, 12:43
20 май 11, 12:43    [10683676]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
1,

Пользуйтесь, пожалуйста, тегом src, чтобы не ломать о ваш код глаза.
20 май 11, 12:44    [10683691]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
1
Guest
ok
20 май 11, 12:53    [10683769]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить что, команда через хр_cmdshell ваполнилась успешно?  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62908
212,

Внешняя программа не обязана возвращать что либо, многие внешнии команды этого не делают.
20 май 11, 12:56    [10683793]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить