Robocopy, tarea de SSIS de proceso de ejecución de varias líneas o resultados de archivo de lote de salida a SSIS

StackOverflow https://stackoverflow.com/questions/1626176

  •  06-07-2019
  •  | 
  •  

Pregunta

Necesito robocopiar archivos de una ubicación a otra en un paquete SSIS. Como la carpeta está en otro dominio, necesito suplantar otra cuenta antes de ejecutar el comando robocopy.exe. Descubrí que puedo ejecutar un "uso neto" comando para suplantar la cuenta de usuario necesaria y luego ejecutar el comando robocopy inmediatamente después. No veo ninguna forma de hacer esto en un comando Ejecutar proceso para hacerlo directamente, por lo que utilizo una tarea Ejecutar proceso para ejecutar un archivo por lotes que tiene estos dos comandos como líneas separadas. La desventaja de este enfoque es que no puedo leer los resultados del comando Ejecutar proceso. Entonces esto me lleva a tres preguntas:

  1. ¿Hay alguna manera de ejecutar un comando de varias líneas en una sola tarea Ejecutar proceso?
  2. ¿Hay alguna manera de ejecutar robocopy.exe mientras se hace pasar por otra cuenta en una línea?
  3. ¿Hay alguna manera de volver a escribir los resultados de un archivo por lotes en una variable en SSIS o en el registro de la base de datos de SSIS?

Si hay una respuesta positiva para cualquiera de las tres preguntas anteriores, entonces puedo encontrar una manera de agregar reglas de éxito o fracaso en el trabajo basadas en los resultados del comando robocopy.

¿Fue útil?

Solución

Esto se puede lograr fácilmente si ha habilitado el uso del Procedimiento almacenado extendido "xp_cmdshell" (consulte Libros en línea para " Configuración del área de superficie ").

En el siguiente ejemplo, he creado un archivo .CMD que contiene todas mis opciones de ROBOCOPY y simplemente ejecuta este archivo de comando usando xp_cmdshell tomando la salida a una variable de tabla (puede ser una tabla persistente):

Simplemente agregue una tarea Ejecutar instrucción T-SQL a su paquete SSIS con la siguiente instrucción:

/** START **/

DECLARE @cmdfile nvarchar(255) = N'C:\myFolder\myCommandFile.cmd'
DECLARE @logtable table (
    [RowId] integer IDENTITY(1,1) NOT NULL
    ,[Message] nvarchar(1024) NULL
)

INSERT INTO @logtable ([Message])
EXEC xp_cmdshell @cmdfile

SELECT *
FROM @logtable
WHERE
[Message] IS NOT NULL

/** END **/

Dependiendo de las opciones de registro establecidas para el comando ROBOCOPY, puede mostrar el progreso, encabezados, informes o más. Consulte la documentación de ROBOCOPY para ver esas opciones. También intente usar el modificador / TEE si desea obtener cualquier salida de consola del comando ROBOCOPY.

Otros consejos

Una forma en que se me ocurre hacer esto es ejecutar un comando por lotes (para que pueda ejecutar varias líneas de pedido) con RUNAS (para suplantar a otra cuenta de usuario)

Puede capturar la salida del archivo por lotes en un archivo de registro y leer su contenido en SSIS utilizando la secuencia de comandos.

No estoy seguro de cómo escribir en el registro de SSIS y estoy interesado en ver lo que otros desarrolladores tienen que decir al respecto.

Encontré dos métodos redondos para obtener datos de la ejecución de un archivo por lotes en la base de datos. Un método es agregar el registro al archivo por lotes real. Todavía no lo he probado, pero parece conceptualmente posible. La otra opción que he probado que ha funcionado es colocar la ejecución del archivo por lotes como un paso de trabajo del Agente SQL Server y agregar el registro de archivos planos. Después de hacer esto, creé un pequeño paquete que raspa el archivo para mensajes específicos. Todavía preferiría una solución mejor, pero esto funciona bastante bien por ahora.

  

¿Hay alguna manera de ejecutar un comando de varias líneas en un solo Ejecutar   ¿Tarea de proceso?

Sí, use " Cmd.exe " como ejecutable Cree una variable string con la siguiente expresión (muestra):

*"/C \"start robocopy c:\\temp\\v10.2a c:\\temp\\v1 *.WRI /Z /S && start robocopy c:\\temp\\v10.2a c:\\temp\\v1 *.dll /Z /S\""*

Y luego se asigna al parámetro de argumentos a través de la expresión del componente. Luego puede ejecutar esos dos (o más) robocopy en //

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top