Запуск Winscp из SSIS выполнить задачу процесса - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь реализовать решение в SSIS, в котором мы должны загружать файлы из SFTP с помощью Winzip.Имена файлов в SFTP похожи на ABC_CNT_03_06_2019_02-05_AM.csv.Требуется загрузить файл текущей даты.В этом случае мы должны игнорировать часть времени в имени файла.

В настоящее время я пытаюсь реализовать следующее решение:

  1. Создана переменная (User :: Filename)в ssis для создания имени файла ABC_CNT_03_06_2018*.csv
  2. В задаче «Выполнить процесс»: выбрали C:\Program Files (x86)\WinSCP\WinSCP.com в исполняемом файле
  3. Аргументы: /script="F:\Upload.txt /parameter " + User::Filename
  4. upload.txt haтекст ниже option batch on option confirm off open username: password@sftp2.ftpname.com get /%1% F:\downloadfolder close exit

Попытка запустить пакет, но он не работает.Можете ли вы предложить дальше?

1 Ответ

1 голос
/ 28 мая 2019

Для чего-то подобного я бы порекомендовал использовать задачу «Сценарий» со сборкой WinSCP .NET, которая позволит вам использовать функциональность C # для проверки даты в файле перед передачей. Пример этого процесса ниже. Поскольку вы сохраняете начало имени файла (включая дату) в переменной, в свойстве Name используется метод String.StartsWith, поскольку он возвращает только имя файла без пути к папке. Метод String.EndsWith также используется для сопоставления только CSV-файлов, как указано в вашем посте. Переменная SSIS, содержащая имя файла, должна быть добавлена ​​в поле ReadOnlyVariables задачи «Сценарий», а также переменные, содержащие пути к папкам, если вы их так храните. Если вы столкнулись с ошибкой, связанной с загрузкой сборки WinSCP, для ее решения можно использовать делегат ResolveEventHandler, как показано ниже. Расположение, в которое была загружена библиотека WinSCP, - это путь, отправленный методу LoadFile. Хотя похоже, что вы ожидаете только один файл в день, список используется в том случае, если в один день будет несколько файлов.

using System.Linq;
using WinSCP;
using System.Collections.Generic;

//load WinSCPnet.dll  
 static ScriptMain()
 {
     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
 }
 static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
 {
     if (args.Name.ToUpper().Contains("WINSCPNET"))
     {
         string path = @"C:\WinSCP Download Path\";
         return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "WinSCPnet.dll"));
     }
     return null;  
 }

    public void Main()
    {
      //get file name and local/remote paths from SSIS variables.
      string fileDateName = Dts.Variables[“User::FileDateName”].Value.ToString();
      string remotePath = Dts.Variables[“User::RemoteFilePath”].Value.ToString();    
      string localPath = Dts.Variables[“User::LocalFilePath”].Value.ToString();

 SessionOptions sessOpt = new SessionOptions
   {
     Protocol = Protocol.Sftp,
     HostName = "SFTPsite.com",
     UserName = "user",
     Password = "password",
     SshHostKeyFingerprint = "Your SshHostKeyFingerprint"
   };

 using (Session session = new Session())
 {
   session.Open(sessOpt);

   TransferOptions transferOptions = new TransferOptions();
   transferOptions.TransferMode = TransferMode.Binary;


   RemoteDirectoryInfo rdi = session.ListDirectory(remotePath);

   //confirm beginning of file name and extension
   List<string> fileList = rdi.Files.Where(file => (file.Name.StartsWith(fileDateName))
   && (file.FullName.EndsWith(".csv"))).Select(file => file.FullName).ToList();

   foreach (string s in fileList)
   {
       //transfer files
       session.GetFiles(s, localPath, false, transferOptions);
   }

 }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...