22 marzo 2015

Tarea Data Profiling

Data Profiling es una tarea cada vez más utilizada, así como, es necesario comprender los datos extraídos de orígenes en detalle y también reducir los problemas con la calidad de datos durante el proceso de integración de datos. En un escenario ETL, este perfilado de datos debería hacerse antes de que el proceso ETL acceda al sistema de origen directamente, o si eso no es posible, entonces después del stage Extracción donde generalmente no hay ninguna transformación en los datos aplicados. Si el perfilado de datos no es conocido, el riesgo de problemas durante los stages posteriores (Transformación y Carga) se incrementarán significativamente.
Cuando los datos de origen son perfilados usando esta tarea, la salida podría ser una columna null ratio, longitudes de columna y distribución de valores, patrón de la columna, y también las columnas candidatas para ser llaves. La salida de este análisis genera reportes XML que pueden ser guardados a un archivo o a una variable SSIS.
Los resultados recogidos por la Tarea Data Profiling son muy útiles para afinar una base de datos.
 

Alistarse

Para alistarse para este ejercicio, utilice los siguientes pasos:
1.    Abra el SQL Server Data Tools (SSDT) y cree un nuevo proyecto SSIS.
2.    Proporcione un nombre y una ubicación para el proyecto SSIS y proceda.
3.    Seleccione el paquete creado por defecto y renómbrelo a ProfileCustomers.dtsx.

Ejercicio

Considere un escenario donde es requerido para hacer un reporte de pre-análisis o perfilado de datos que necesita ser extraído de los orígenes. Este análisis es requerido para ver el nivel de calidad de datos con el fin de reducir los problemas durante el proceso ETL.
1.    En el panel Connection Managers, crear una New ADO.NET connection que apunte a la base de datos de muestra AdventureWorksLT2012.
2.    Si la conexión no existe, pulse el botón New para configurar una nueva. Renombre la conexión creada a cmAdventureWorksLT.
3.    Agregue una Tarea Data Profiling al Control Flow para el perfilado de los datos de clientes en el ejemplo Adventure Works.
4.    Abra la tarea para la edición.
5.    Pulse el botón Quick Profile… para utilizar las configuraciones por defecto.
6.    En la propiedad ADO.NET connection, seleccione la conexión creada en el paso anterior.
7.    En la Table or View, seleccione la tabla [SalesLT].[Customer] para ser perfilado bajo esta tarea.
 
8.    Pulse el botón OK y eche un vistazo a los detalles de cada solicitud de perfilado bajo la ficha Profile Requests. Cada tipo de perfil o solicitud tiene sus propias propiedades que pueden ser cambiadas para adaptarse a las necesidades de cada proyecto.
9.    Ahora que la solicitud de perfilado es creada, es necesario configurar donde será colocada la salida. En la ficha General, bajo Destination establezca la propiedad DestinationType a FileConnection y la propiedad Destination a New File Connection.
10.  En la ventana desplegable File Connection Manager Editor, establezca la propiedad Usage type a Create file y en la propiedad File establezca el nombre del archivo XML que almacenará la salida proporcionada por la tarea.
11.  Ejecute el paquete pulsando F5. Si la ejecución tiene éxito, el reporte será generado en el archivo XML definido previamente.
12.  Hay dos opciones para ver el reporte generado: la opción Open Profile Viewer... en el Data Profiling Task Editor o en el atajo bajo Start Menu | All Programs | Microsoft SQL Server 2012 | Integration Services | Visor de Perfil de Datos SQL Server 2014.
 
13.  En el Visor de Perfil de Datos SQL Server 2014 pulse Open, localice el XML creado antes, y ábralo.
14.  Los resultados extensos para cada columna podría ser analizado en detalle seleccionando la tabla y el tipo de perfilado en el panel izquierdo y seleccionando cada columna en el panel derecho.
Funcionamiento
Los pasos anteriores explican un escenario simple y básico para perfilar datos de origen que serán extraídos, transformados y cargados durante el proceso ETL. Básicamente, para aplicar esta tarea, es necesario identificar las tablas y columnas que pueden causar problemas de calidad, seleccionar qué tipo de perfil se aplica a cada uno, y finalizar ejecutando el paquete que generará el reporte de salida en un archivo XML.

Tarea XML

XML es un formato universal para los datos en diferentes plataformas, y hay muchas empresas que trabajan con datos XML y envían y reciben datos a través de sistemas como archivos XML. Hay algunas operaciones que pueden ser hechas con los datos XML: validación de archivos XML a través de archivos XSD o DTD, transformación de datos XML con XSLT, consulta de datos de XML con XPath, y otras operaciones que son soportadas en muchas aplicaciones y lenguajes de programación de hoy en día.
La tarea XML de SSIS es una tarea poderosa que proporciona algunas de estas operaciones sobre los datos XML. En este ejercicio, traemos los datos de una tabla como XML, lo validamos en un archivo XSD, y luego lo transformamos con XSLT.

Alistarse

1.    Guarde el contenido de books.xml y books.xsd de esta dirección en archivos físicos: http://msdn.microsoft.com/en-us/library/ms762258(v=VS.85).aspx.
2.    Crear un nuevo archivo vacío en esta dirección: C:\SSIS\Control Flow\Archivos\xslt_result.xml.

Ejercicio

1.    Crear un nuevo proyecto SSIS y nómbrelo TareaXML.
2.    Crear una nueva variable de tipo String de alcance paquete; nómbrelo IsValid.
3.    Arrastre y suelte una Tarea XML desde la Toolbox SSIS en el Control Flow.
4.    Haga doble clic en la Tarea XML y abra el XML Task Editor.
5.    En la pestaña General establezca OperationType como Validate.
6.    Establezca SourceType como File Connection, y crear un nuevo administrador de conexión de archivo para el archivo books.xml en la propiedad Source.
7.    Establezca SaveOperationResult como True.
8.    En la sección OperationResult, establezca DestinationType como Variable, y establezca Destination como User::IsValid y OverwriteDestination como True.
9.    Establecer SecondOperandType como File Connection y crear un nuevo administrador de conexión de archivo para books.xsd en la propiedad SecondOperand.
10.  Verifique si la ValidationType es XSD, y verifique si sus ajustes coinciden con los de la siguiente captura de pantalla:
 
11.  Haga clic en OK y cierre la Tarea XML.
12.  Añadir una Tarea Script de la Toolbox SSIS en el Control Flow inmediatamente después de la Tarea XML y dele doble clic, escriba User::IsValid en la propiedad ReadOnlyVariables, y luego, haga clic en Edit Script y escriba una línea de código para MessageBox como son mostrados a continuación en el método Main() de los scripts:
public void Main()
{
MessageBox.Show(
string.Format("Validation Result: {0}",
Dts.Variables["User::IsValid"].Value));
   Dts.TaskResult = (int)ScriptResults.Success;
}
13.  Una la tarea XML con la tarea Script, con la flecha verde. Ejecute el paquete y verifique el valor del cuadro de mensaje; verá Validation Result: false.
14.  Crear un nuevo paquete y realizar todos los pasos del 2 al 12 de nuevo para este nuevo paquete, esta vez cambiar la conexión de archivo SecondOperand para que apunte al archivo books_new.xsd (este es un archivo modificado de books.xsd, se encuentra en la sección Funcionamiento más adelante).
15.  Ejecute el paquete de nuevo, y esta vez obtendrá Validation Result:true.
16.  Crear un nuevo paquete y nómbrelo XSLT.
17.  Arrastrar y soltar una Tarea XML de la Toolbox SSIS en el Control Flow. Haga doble clic en la Tarea XML y abra el XML Task Editor.
18.  Establecer la OperationType como XSLT.
19.  Establezca SourceType como File Connection y crear una conexión a books.xml en la propiedad Source.
20.  Establecer la SecondOperandType como File Connection y crear una conexión de archivo para el archivo books.xslt (este es un archivo que se encuentra en la sección Funcionamiento más adelante) en la propiedad SecondOperand.
21.  Establecer la SaveOperationResult como True. Bajo OperationResult, establezca la DestinationType como File Connection y crear una conexión de archivos para xslt_result.xml bajo la propiedad Destination; establecer la OverwriteDestination como True.
22.  Verifique todas las configuraciones con la siguiente captura de pantalla:
 
23.  Cerrar la Tarea XML y ejecutar el paquete. Después de ejecutar el paquete, verifique el contenido del archivo xslt_result.xml. Debería ver una versión transformada de los datos de books.xml en un nuevo estilo.

Funcionamiento

La Tarea XML proporciona operaciones amplias para datos XML. Para elegir qué hacer con la Tarea XML debemos establecer la propiedad OperationType.
Para los primeros trece pasos de este ejercicio utilizamos la Tarea XML para validar los datos XML sobre un archivo de estructura XSD. Para este ejemplo, establecemos la OperationType como Validate. Validate comprobará la validez de los datos XML sobre archivos de estructura XSD o  DTD.
Como XML es una forma estándar de almacenar los datos y es ampliamente utilizada en aplicaciones y lenguajes de programación, hay una necesidad de definir la sintaxis para los datos XML. Cuando almacenamos datos en una tabla de SQL Server, debemos obedecer las reglas definidas en el momento de diseñar la tabla que define la estructura de la tabla.
Podemos crear un archivo para la sintaxis y la estructura de datos XML. La estructura XML puede ser definida de tres maneras: DTD, XDR, y XSD. Cada una de estas formas tiene su propio formato para la definición de la estructura. Una explicación de la diferencia entre ellos está más allá del alcance de este post; puede leer más acerca de estos tipos y cómo utilizar sus métodos de validación en lenguajes .NET en http://support.microsoft.com/kb/307379.
La Tarea XML de SSIS soporta sólo DTD y XSD para validación. Podemos elegir el tipo de validación por la propiedad ValidationType en la ficha General del XML Task Editor.
También puede configurar la Tarea XML para fallar si la validación sobre el archivo de esquema (archivo DTD o XSD). Por ello conviene establecer FailOnValidationFail a True. Esta opción es False por defecto.
Cada operación en la Tarea XML necesita dos operandos; en las primeras doce partes de nuestro ejercicio utilizamos Validate, que necesita dos operandos; el primer operando es los datos XML y el segundo operando es su esquema.
Establecemos Source como la conexión de archivos books.xml, que obtiene datos XML desde el archivo books.xml, el primer operando en la Tarea XML.
Establecemos el segundo operando como una conexión de archivos que apunta al archivo XSD books.xsd.
Tanto el origen y el segundo operando pueden ser una File Connection, Variable, o Direct input.
El resultado de la Tarea XML en cada operación es diferente, pero en todos los casos el resultado puede guardarse en algún lugar. En este ejemplo, utilizamos una variable String llamada IsValid para almacenar el resultado de la Tarea XML. También establecemos las propiedades que almacenan resultados XML en la sección Output de la ficha General del XML Task Editor.
Después de describir las diferentes opciones en el XML Task Editor, es el momento para describir cómo el XML será validado sobre el XSD. Echemos un vistazo a los datos XML primero. Los datos del archivo books.xml es similar al siguiente:
<?xml version="1.0"?>
<x:books xmlns:x="urn:books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:books books.xsd">
   <book id="bk001">
<author>Hightower, Kim</author>
<title>The First Book</title>
<genre>Fiction</genre>
<price>44.95</price>
<pub_date>2000-10-01</pub_date>
<review>An amazing story of nothing.</review>
   </book>
   <book id="bk003">
<author>Nagata, Suanne</author>
<title>Becoming Somebody</title>
<genre>Biography</genre>
<review>A masterpiece of the fine art of gossiping.</review>
   </book>
   <book id="bk002">
<author>Oberg, Bruce</author>
<title>The Poet's First Poem</title>
<genre>Poem</genre>
<price>24.95</price>
<review>The least poetic poems of the decade.</review>
   </book>
</x:books>
Los datos XML contienen múltiples elementos de libros y cada elemento de libro tiene algunos sub-elementos, tales como autor, título, género, precio, fecha_pub, y revisión. Describir la estructura de XML está más allá del alcance de este post; puede leer más acerca de XML en http://www.w3schools.com/xml/default.asp.
El esquema para este XML está en el archivo books.xsd, y el esquema se ve así:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:books"
xmlns:bks="urn:books">
 <xsd:element name="books" type="bks:BooksForm"/>
 <xsd:complexType name="BooksForm">
   <xsd:sequence>
<xsd:element name="book"
type="bks:BookForm"
minOccurs="0"
maxOccurs="unbounded"/>
   </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="BookForm">
   <xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price" type="xsd:float" />
<xsd:element name="pub_date" type="xsd:date" />
<xsd:element name="review" type="xsd:string"/>
   </xsd:sequence>
   <xsd:attribute name="id" type="xsd:string"/>
 </xsd:complexType>
</xsd:schema>
Como se puede ver en el XSD, la información de esquema es descrita. Cada elemento de libro consiste de un tipo de datos complejo, que contiene sub-elementos autor, título, género, precio, fecha_pub, y revisión, y el tipo de datos de cada elemento es definido en el atributo type.
Note que cuando minOccurs no está definido en un elemento, ese elemento será considerado como requerido. Esto significa que más allá de que todos los elementos deben existir para cada elemento de libro, y si uno de estos sub-elementos están faltando, la validación sobre esta XSD retornará False. Esto es el por qué la variable IsValid tenía un valor False en el paso 13.
Cambiamos el XSD en el paso 14 y creamos un nuevo archivo XSD llamado books_new.xsd. La información de esquema para este archivo aparece como sigue:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:books"
xmlns:bks="urn:books">
 <xsd:element name="books" type="bks:BooksForm"/>
 <xsd:complexType name="BooksForm">
   <xsd:sequence>
<xsd:element name="book"
type="bks:BookForm"
minOccurs="0"
maxOccurs="unbounded"/>
   </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="BookForm">
   <xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price"
type="xsd:float" minOccurs="0" maxOccurs="unbounded" />
  <xsd:element name="pub_date"
type="xsd:date" minOccurs="0" maxOccurs="unbounded" />
  <xsd:element name="review" type="xsd:string"/>
   </xsd:sequence>
   <xsd:attribute name="id" type="xsd:string"/>
 </xsd:complexType>
</xsd:schema>
En este nuevo archivo de esquema note la parte en negrita para los sub-elementos price y pub_date. Definimos la minOccurs como 0; esto significa que price y pub_date serán elementos opcionales y que omitir estos sub-elementos no causarán al XML a fallar sobre la validación. Esta fue la razón por la cual la variable IsValid era True en el paso 15.
Desde el paso 16 empezamos otro ejemplo de una Tarea XML con la OperationType a XSLT.
XSLT significa eXtensible Stylesheet Language Transformation. XSLT es un lenguaje de hoja de estilo común, que proporciona una manera de transformar los datos XML existentes a un nuevo estilo. Esta operación es una manera muy útil para disminuir la complejidad de los datos XML. Si tratamos de leer los datos XML complejos con XML Source, vamos a obtener resultados extraños, y el XML Source a veces no resolverá estructuras de datos XML complejas. Aquí es donde la Tarea XML con la OperationType a XSLT entra en juego. Con XSLT simples podemos transformar el XML existente a datos XML más sencillos.
En este ejemplo, nuestro archivo books.xml es bastante simple y no hay necesidad de cambiarlo. Sin embargo, supongamos que queremos traer sólo las partes del autor y el título del XML y ellos tienen atributos en lugar de sub-elementos.
Así creamos el código XSLT para hacer esta transformación, la XLST en nuestro ejemplo luce así:
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="urn:books"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:books books.xsd">
  <xsl:output method="xml" indent="yes" version="2.0"
   encoding="UTF-8" />
  <xsl:template match="/">
    <xsl:element name="x:books">
      <xsl:for-each select="x:books/book">
        <xsl:element name="book">
          <xsl:attribute name="author">
            <xsl:value-of select="./author"/>
          </xsl:attribute>
          <xsl:attribute name="title">
           <xsl:value-of select="./title"/>
          </xsl:attribute>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
Los detalles de la sintaxis y el lenguaje XSLT están más allá del alcance de este post; puede aprender más sobre XSLT de http://www.w3schools.com/xsl/default.asp.
El resultado de aplicar este XSLT en los datos de books.xml (que ya está almacenada en xslt_result.xml) luce así:
<?xml version="1.0" encoding="utf-8"?>
<x:books xmlns:x="urn:books">
   <book author="Hightower, Kim" title="The First Book" />
   <book author="Nagata, Suanne" title="Becoming Somebody" />
   <book author="Oberg, Bruce" title="The Poet's First Poem" />
</x:books>
Cada libro es dividido en un elemento y los subelementos autor y título son transformados en atributos en la nueva estructura de datos XML.

Adicional

Hay más operaciones que la Tarea XML proporciona para trabajar con datos XML; vamos a explorar esas operaciones.
XPath
XPath es un lenguaje de consulta para XML. Podemos obtener los datos de XML con consultas XPath. La sintaxis y la estructura de consultas XPath pueden ser encontradas aquí: http://www.w3schools.com/xpath/default.asp.
Supongamos que queremos obtener el título de todos los nodos y crear un nuevo archivo con los nodos de título solamente. Así que trataremos de hacer esto con estos pasos:
1.    Arrastrar y soltar una nueva Tarea XML desde el Toolbox SSIS en el Control Flow, y en el editor XML, establecer la OperationType como XPath.
2.    Establecer Source como una File Connection a books.xml.
3.    Establecer SecondOperandType como Direct input, y establecer SecondOperand como x:books/book/title.
4.    En Namespaces añadir un elemento con un prefijo como x, y URI como urn:books.
5.    Establecer XPathOperation como Node list.
6.    Establecer las propiedades Output para guardar la salida al archivo xpath_result.txt.
7.    Confirmar todas sus configuraciones con esta captura de pantalla:
8.    Ejecute el paquete y verifique el archivo xpath_result.txt por los resultados; debería lucir como esto:
<title>The First Book</title>
<title>Becoming Somebody</title>
<title>The Poet's First Poem</title>
Merge
Con la operación Merge podemos fusionar dos archivos XML, el primer archivo XML será configurado en Source, y el segundo archivo será configurado en SecondOperand. La Tarea XML fusionará el contenido del segundo archivo XML en el primer archivo XML.
Diff
Esta operación comparará el primer archivo XML con el segundo archivo y genera un documento DiffGram con las diferencias entre los dos archivos XML de entrada.
En la operación Diff podemos elegir algunas opciones, como ignorar los comentarios, namespaces, prefijos y otras opciones muy claras que no necesitan mayor explicación.
Patch
Patch aplicará el resultado de un documento DiffGram (que es el resultado de una operación Diff sobre dos documentos XML), y crear un documento XML padre que contiene el contenido del documento DiffGram.
Más explicación sobre Diffgram puede ser encontrado aquí: http://msdn.microsoft.com/enus/library/aa302295.aspx.

21 marzo 2015

Tarea Execute Process

Una de las tareas más prácticas en el Control Flow de SSIS es la tarea Execute Process. Con esta tarea podemos ejecutar cualquier otra aplicación que tiene un archivo ejecutable. La única cosa a considerar es que el archivo ejecutable debería ser ejecutado en modo silencioso porque SSIS no está hecho para la interacción con los usuarios. En este ejercicio, comprimiremos y descomprimiremos algunos archivos con esta tarea con la ayuda de 7-Zip.

Alistarse

1.    Completar y finalizar el ejercicio Enviar y recibir archivos a través de FTP: Tarea FTP y utilizar los archivos de texto descargados como entrada para este ejercicio. Estos archivos deberían estar en C:\SSIS\Control Flow\TareaFTP\CarpetaLocal.
2.    Descargue e instale 7-Zip de http://www.7-zip.org.
3.    Crear un nuevo directorio vacío para archivos extraídos aquí: C:\SSIS\Control Flow\TareaExecuteProcess\ArchivosExtraidos.

Ejercicio

1.    Crear un nuevo proyecto Integration Services en SSDT y nombre el proyecto como TareaExecuteProcess.
2.    Arrastrar y soltar una Tarea Execute Process de la Toolbox SSIS al Control Flow.
3.    Nombre la tarea Compress y haga doble clic para abrir el Execute Process Task Editor.
4.    Vaya a la pestaña Process. En la propiedad Executable seleccione el archivo 7z.exe desde el directorio instalado; la dirección debería tener este aspecto: C:\Program Files\7-Zip\7z.exe.
5.    Establecer el WorkingDirectory a la ruta de los archivos de texto que debería ser comprimido; para nuestro ejercicio la ruta de los archivos de texto del ejercicio de la tarea FTP: C:\SSIS\Control Flow\TareaFTP\CarpetaLocal.
6.    En la propiedad Arguments escribir un modificador de línea de comandos y comandos para 7z, de la siguiente manera:
a -t7z files.7z *.txt
7.    Confirme todas sus configuraciones con la siguiente captura de pantalla:
8.    Arrastrar y soltar otra Tarea Execute Process después de la primera, nombre ésta como Decompress, y conecte la flecha verde de Compress a Decompress.
9.    Haga doble clic en Decompress, vaya a la pestaña Process y establezca Executable a la ruta de archivo 7z.exe: C:\Program Files\7-Zip\7z.exe.
10.  Establecer el WorkingDirectory con la dirección de la carpeta a la que extraerá sus archivos; en este ejemplo sería: C:\SSIS\Control Flow\TareaExecuteProcess\ ArchivosExtraidos.
11.  Establecer Arguments con un comando unzip y cámbielo como sigue:
x "C:\SSIS\Control Flow\TareaFTP\CarpetaLocal\files.7z"
12.  Compruebe que la ficha Process en Decompress coincide con la siguiente captura de pantalla:
13.  Ejecute el paquete. Compress creará un archivo comprimido llamado files.7z de todos los archivos de texto en la ruta especificada y luego Decompress extraerá el contenido de files.7z a otra carpeta.

Funcionamiento

Con la tarea Execute Process podemos ejecutar varios archivos ejecutables en el flujo de control. También podemos pasar argumentos y definir un directorio de trabajo para el archivo ejecutable.
En este ejercicio hemos utilizado dos tareas Execute Process. La primera, Compress, archivará todos los archivos de texto de C:\SSIS\Control Flow\TareaFTP\CarpetaLocal en files.7z. Para este ejercicio utilizamos la aplicación 7-Zip, que es gratuito y de código abierto.
La propiedad Executable en la Tarea Execute Process debería contener la dirección del archivo ejecutable, que es la dirección del archivo 7z.exe en nuestro ejercicio. Arguments son los comandos y los interruptores que deben ser proporcionados por las ejecuciones de línea de comandos. En este ejercicio, primero comprimimos los archivos con el argumento de un comando, que es un comando para guardar archivos en 7-Zip. Luego, con el comando x extraemos los datos del archivo comprimido.
Todos los interruptores y los argumentos de línea de comandos para 7-Zip pueden ser vistos aquí:
http://www.dotnetperls.com/7-zip-examples.
WorkingDirectory define en donde las direcciones en la línea de comandos funcionarán; si no proporciona la dirección completa, la dirección será buscada en el directorio de trabajo.
Podemos elegir pasar la entrada al ejecutable de una variable, y deberíamos utilizar StandardInputVariable.
También podemos almacenar la salida de un ejecutable en una variable con StandardOutputVariable. Si ocurre algún error durante la ejecución del proceso, el error puede ser almacenado en una variable con la opción StandardErrorVariable.
WindowStyle define cómo debería aparecer la ventana de diálogo de un ejecutable; es inútil cuando las aplicaciones son ejecutadas en el servidor.
SuccessValue definirá la interpretación del código retornado del archivo ejecutable. Su valor por defecto es cero, y esto significa que un ejecutable será considerado como fallido si retorna un valor distinto de cero. Podemos cambiar este comportamiento cambiando la opción SuccessValue.
Obviamente, diferentes ejecutables retornan valores distintos como su respuesta exitosa.