Необходимо передать переменную SSIS в задачу «Выполнить процесс», чтобы сделать аргумент динамической командной строки для Winscp.

У меня есть папка 'DATA' в местоположении SFTP, откуда мне нужно загрузить набор файлов в какое-то общее место, а затем скопировать соответствующие файлы в другое место папки.

Имена файлов:

Test1.csv
Test2.csv
Test3.csv
Test4.csv
Test5.csv

Я хочу, чтобы эти файлы сначала загружались в указанное ниже место:

G:\USER_DATA\USER_USER_SYNC\Download

Поскольку эти файлы относятся к разным схемам и должны обрабатываться отдельно каждым отдельным пакетом ssis для дальнейшего преобразования и загрузки. По некоторым причинам мы должны сначала сохранить его в каком-то общем месте, а затем переместить или скопировать. Вот мой аргумент командной строки.

/log=G:\USER_DATA\USER_USER_SYNC\SFTP_LOG\user_sync_winscp.log /command "open sftp://username:[email protected]/" -hostkey=""ssh-rsa 2048 9b:63:5e:c4:26:bb:35:0d:49:e6:74:5e:5a:48:c0:8a""" "get /DATA/Test1.csv G:\USER_DATA\USER_USER_SYNC\Download\" "exit"

Используя указанное выше, я могу загружать заданный файл по одному за раз.

Так как мне нужно сначала разместить его в какой-нибудь общей папке. Следовательно, я планирую добавить еще одну задачу процесса «Выполнить» для копирования файлов.

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing2

и так далее...

Я ищу способ, с помощью которого мы можем загрузить все доступные файлы в какое-то общее расположение папки, а затем переместить или скопировать в другие места папки.


person vikrant rana    schedule 27.08.2019    source источник
comment
Что насчет этого? Передача значений переменных в файл .bat с помощью задачи «Выполнить процесс» и многих других.   -  person Martin Prikryl    schedule 27.08.2019
comment
Хотя более эффективным способом было бы поместить все файлы в одну командную строку. В противном случае вы откроете новое соединение для каждого файла.   -  person Martin Prikryl    schedule 27.08.2019
comment
Спасибо Мартин Прикрыл. Я тоже посмотрю на этот вариант. Спасибо.   -  person vikrant rana    schedule 27.08.2019
comment
Как мы можем работать с более поздним вариантом. чтобы поместить все файлы в одну командную строку. Такой вариант выглядит более эффективным.   -  person vikrant rana    schedule 27.08.2019
comment
Похоже, вы действительно близки. Просто установите выражение в свойстве Arguments в Задаче «Выполнение процесса».   -  person Tim Mylott    schedule 27.08.2019
comment
Как мы можем работать с более поздним вариантом. чтобы поместить все файлы в одну командную строку - Вам нужно сделать что-то вроде "cd /DATA" "get Test1.csv Test2.csv Test3.csv ... G:\USER_DATA\USER_USER_SYNC\". Вам нужно сгенерировать Test1.csv Test2.csv Test3.csv из вашего FileNameList. Это, наверное, легко, но я не знаю, как это сделать в SSIS. Вы можете задать более конкретный вопрос по этому поводу.   -  person Martin Prikryl    schedule 28.08.2019
comment
@ Мартин Прикрыл. эта штука работает хорошо cd / DATA get Test1.csv Test2.csv Test3.csv .. таким образом нам не нужно каждый раз создавать новое соединение. вы можете опубликовать это как ответ. Я приму это. Просто спросите, можем ли мы также назначить другое местоположение для пункта назначения. например .. Test1.csv должен идти в G: \ USER_DATA \ USER_USER_SYNC \ Download1 \, а Test2.csv должен идти в G: \ USER_DATA \ USER_USER_SYNC \ Download2 \. Спасибо   -  person vikrant rana    schedule 28.08.2019
comment
Так как же вы сгенерировали Test1.csv Test2.csv Test3.csv из своей таблицы SQL?   -  person Martin Prikryl    schedule 28.08.2019
comment
Если вам нужны другие места, просто повторите команду get, например: "get Test1.csv G:\USER_DATA\USER_USER_SYNC\Download1\" "get Test2.csv G:\USER_DATA\USER_USER_SYNC\Download2\"   -  person Martin Prikryl    schedule 28.08.2019
comment
Большое спасибо за вашу любезную помощь. Эти команды действительно полезны.   -  person vikrant rana    schedule 28.08.2019
comment
Если у вас есть рабочее решение, опубликуйте его в качестве ответа.   -  person Martin Prikryl    schedule 29.08.2019


Ответы (1)


Я изменил дизайн и применил новый подход. Спасибо Мартину за исправление проблем, связанных с sftp, и постоянную поддержку.

ssis package Новый пакет SSIS имеет следующие задачи:

Шаг 1. Он будет искать последние обновленные файлы на сервере sftp и загружать указанные файлы Test1.csv и Test2.csv в расположение G:\USER_DATA\USER_USER_SYNC\Download\.

Вот мои аргументы командной строки:

/log=G:\USER_DATA\USER_USER_SYNC\SFTP_LOG\user_sync_winscp.log /command "open sftp://bisftp:*UFVy2u6jnJ]#hU0Zer5AjvDU4#[email protected]/ -hostkey=""ssh-rsa 2048 9b:63:5e:c4:26:bb:35:0d:49:e6:74:5e:5a:48:c0:8a""" "cd /DATA" "get -filemask=">=today" Test1.csv Test2.csv G:\USER_DATA\USER_USER_SYNC\Download\" "exit"

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

Этот шаг выполнит процесс Window cmd и скопирует Test1.csv в новое место как

G:\USER_DATA\USER_USER_SYNC\Testing1 

аргументы командной строки как:

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test1.csv G:\USER_DATA\USER_USER_SYNC\Testing1

Точно так же у меня есть еще одна задача процесса Execute, чтобы скопировать Test2.csv в новое место как

G:\USER_DATA\USER_USER_SYNC\Testing2

аргументы командной строки как:

/C copy /b G:\USER_DATA\USER_USER_SYNC\Download\Test2.csv G:\USER_DATA\USER_USER_SYNC\Testing2

Данное решение работает нормально, однако есть несколько вещей, которые еще предстоит решить.

Поскольку я загружаю последний файл только с помощью -filemask=">=today"., все работает нормально, если задача выполнения процесса может найти последние файлы на сервере sftp. Если его там нет, то следующая задача процесса выполнения не выполняется с сообщением об ошибке ниже. Возвращаемый код выхода процесса был «1», в то время как ожидаемый был «0»

Здесь я понимаю, что он не работает, поскольку ему нечего копировать или перемещать. Есть ли способ, с помощью которого мы можем захватить код выхода, возвращенный из задачи первого выполнения, и сохранить его в некоторой переменной, чтобы мы могли использовать выражение, чтобы решить, запускать ли следующую задачу или нет.

Во-вторых, как вы можете видеть, я использую две задачи процесса выполнения для копирования файлов из одного места в другое. Можем ли мы сделать что-нибудь, чтобы объединить обе эти две команды в одну задачу процесса выполнения?

Любые предложения приветствуются, и я также думаю, что этот вопрос следует рассматривать как отдельный вопрос.

person vikrant rana    schedule 29.08.2019
comment
Ну, ладно, но тогда у вас действительно нет ответа на ваш первоначальный вопрос. Возможно, вы сможете отредактировать вопрос так, чтобы ваш ответ имел смысл. - person Martin Prikryl; 30.08.2019
comment
@ Мартин Прикрыл .. Согласен. Отредактирую вопрос. Мой подход был неправильным, чтобы зацикливать имена файлов, а затем создавать для этого отдельные sftp-соединения. Мне понравился ваш подход, который эффективнее и быстрее. Это изменило весь контекст вопросов и ответов. :-) Я подниму еще один вопрос, чтобы обсудить дальнейшие вопросы, связанные с обработкой файлов. Еще раз большое спасибо. - person vikrant rana; 30.08.2019