Creo que su pregunta debería estar en el entorno de escritorio. Unix / Linux y todos sus derivados ciertamente tienen un lugar en los centros de datos de la mayoría de las grandes corporaciones.
Personalmente, utilicé Unix hace mucho tiempo desde que vine del área de DOS, pero me cambié a Windows desde que se volvió viable.
En cualquier caso, con cada iteración de la funcionalidad de Windows se agrega y aumenta la complejidad. ¿Pero qué usar, PowerShell, Pyton, Ruby, etc.?
Perl
Perl tiene algunas formas de interactuar con el sistema según lo que espere hacer con el comando externo. Cuando se trata de simplicidad, Perl lo hace bien.
Ejecutar y esperar para obtener el código de salida – Sistema
Lo siguiente ejecutará un comando ipconfig y devolverá un código de salida a Perl:
$ Exitcode = Sistema (“ipconfig”);
Si desea suprimir la salida ya que solo le importa el código de retorno, puede redirigir el comando a NULL:
$ Exitcode = System (“iconfig> nul”);
Ejecutar y continuar – Exec
Exec ejecuta un comando externo y continúa. No recibe ninguna indicación sobre cómo se ejecutó el comando.
Exec (“robocopy d: \\ folder1 d: \\ folder2”);
Nuevamente, si desea suprimir la salida, puede redirigir a NULL:
Exec (“robocopy d: \\ folder1 d: \\ folder2> nul”);
Ejecutar y recuperar la salida – Backticks
Si desea capturar la salida del comando, debe usar los backticks. Por ejemplo, lo siguiente completará la variable $ ipinfo con la salida devuelta de ipconfig. La impresión lo mostrará en la pantalla.
$ ipinfo = `ipconfig`;
Imprimir $ ipinfo;
Potencia Shell
PowerShell también tiene muchas formas de iniciar comandos del sistema, pero se debe principalmente al hecho de que los comandos del sistema se pueden ejecutar de forma nativa en PowerShell. Simplemente escriba un ejecutable y se ejecutará. Debido a esto, puede generar un trabajo de PowerShell en segundo plano con start-job o ejecutar un comando en una computadora remota con invoke-command. Eso sí, no estoy mostrando todas las formas en que puede ejecutar un comando, solo las formas que personalmente uso una y otra vez.
Ejecutar y continuar: proceso de inicio
Start-Process es muy versátil. Personalmente, me gusta usar el alias start cuando uso este cmdlet. Si desea iniciar un comando y no esperar la salida, puede hacer lo siguiente:
iniciar ipconfig
Sin embargo, si desea iniciar un comando con argumentos de línea de comando, deberá usar el parámetro ArgumentList. Esto puede ser un poco incómodo, pero no es difícil. A continuación se ilustra cómo usar robocopy con argumentos en Start-Process:
iniciar robocopy -ArgumentList ‘D: \ Folder1’, ‘D: \ Folder2’
Ejecute y espere para obtener el código de salida – -Esperar y .Exitcode
Puede esperar a que termine un comando utilizando el parámetro -Wait
iniciar robocopy -ArgumentList ‘D: \ Folder1’, ‘D: \ Folder2’ -Esperar
También hay un comando passthru que le dará el objeto de proceso para el proceso que está iniciando. Aquí está mi técnica personal para obtener el código de salida (sí, hay más de una forma de obtener códigos de salida, este es solo mi método preferido):
(inicie ipconfig -wait -passthru) .exitcode
Ejecuta y recupera la salida
En general, si necesito analizar el texto de retorno de un comando, simplemente ejecutaré el comando en línea. Por ejemplo, para establecer la variable $ ipconfig en la salida de ipconfig.exe, puede hacer lo siguiente:
$ ipconfig = ipconfig
En lo anterior, $ ipconfig es en realidad una colección de cadenas. Cada línea de la salida es un elemento en la colección. Si espera que devuelva una sola cadena, deberá unir los elementos junto con “` r`n “.
$ ipconfig = $ ipconfig -join “` r`n ”
Finalmente, si necesita usar espacios en su comando, deberá usar el operador de llamada (&). No dañará nada usar lo siguiente para todos los comandos que necesita de STDOUT, pero solo recuerde que requiere una colección de cadenas. Por ejemplo, lo siguiente funcionará (tenga en cuenta que d: \ folder1 no se cita, pero todavía funciona porque intentará convertir todo lo que ve en una cadena):
& ‘c: \ ruta con espacios \ robocopy.exe’ d: \ folder1 ‘d: \ folder2’
Sin embargo, esto fallará:
& ‘c: \ ruta con espacios \ robocopy.exe d: \ folder1 d: \ folder2’
Para hacer lo anterior, necesitaría usar Invoke-Expression, pero rara vez uso esa función, ya que se considera una mala práctica. La verdad sincera es que me importa muy poco acerca de los ataques de inyección en la mayoría de mi código. Si me importara, estoy seguro de que este artículo estaría plagado de él para discutirlo en todos los idiomas.
Pitón
Python también tiene algunas formas de llamar a programas externos. Según la documentación, parece que todos los casos de uso ahora deberían usar el módulo de subproceso. Para iniciar un comando externo y devolver el código de salida, simplemente puede usar el método call ().
Ejecute y espere para obtener el código de salida – Subprocess.Call ()
Subproceso de importación
Exitcode = subprocess.call (“ipconfig
Una cosa a tener en cuenta, si está utilizando una función que existe en cmd.exe, lo anterior no funcionará. Debe usar el argumento shell = True también. Por ejemplo, para usar dir haría lo siguiente:
Subproceso de importación
Exitcode = subprocess.call ([“dir”, “/ ad”, “c: \\”], shell = True)
También puede hacer lo anterior con una sola cadena:
Exitcode = subprocess.call (“dirc: \\”, shell = True)
Ejecutar y continuar – subprocess.Popen ()
Para ejecutar sin esperar el código de salida, debe usar el método de subproceso Popen (). Todo esto se siente un poco más desarrollado que con Perl y Python. Sin embargo, todo el módulo de subproceso está repleto de toneladas de cosas, ¿cosas útiles? Todavía no estoy seguro, pero esto es lo que sé que necesito.
subprocess.Popen (“ipconfig
Esta técnica comparte STDOUT y parcialmente STDIN. Esto se vuelve realmente confuso cuando haces esto:
t = subproceso.Popen (“powershell
Lo anterior es un divertido truco de fiesta que alternará entre las indicaciones de PowerShell y Python y los intérpretes interactivos. Probablemente no sea una buena idea ejecutar comandos interactivos de esta manera.
Si desea evitar que se muestre la salida, puede usar la redirección a NULL como vimos anteriormente en este artículo al analizar Perl. Sin embargo, hay algunos pequeños trucos con el módulo de subproceso que creo que vale la pena aprender. Puede establecer STDOUT en NULL al invocar Popen (). También puede configurar otras transmisiones como STDERR de esta manera. Por ejemplo, lo siguiente establecerá STDOUT en NULL y luego STDERR en STDOUT.
subprocess.Popen (“ipconfigdout = (abierto (os.devnull, ‘w’)), stderr = subprocess.STDOUT)
Ejecutar y recuperar la salida – suprocess.PIPE
De manera similar, cómo establecemos stdout en nulo, también podemos establecer stdout para que sea igual a PIPE para que luego podamos inspeccionar la propiedad stdout del objeto devuelto por Popen (). Lo siguiente ilustra esto:
p = subprocess.Popen (“ipconfigdout = subprocess.PIPE)
salida = p.stdout.read ()
Los lenguajes de script por su naturaleza están diseñados para ser extremadamente versátiles. A veces hay demasiadas formas de hacer lo mismo. Este tipo de expansión puede hacer que las cosas sean extremadamente fáciles de usar y extremadamente difíciles de resolver al mismo tiempo. Debido a esto, es realmente importante realizar un seguimiento de las técnicas que funcionan para usted y crear una biblioteca para sus casos de uso comunes. Personalmente, creo que los tres casos de uso que describí en este artículo son más que suficientes: ejecutar y esperar para obtener el código de salida, ejecutar y continuar, ejecutar y recuperar la salida. Creo que en el caso de los tres idiomas hay formas justas de realizar estas tareas.
La técnica Python se destaca porque es un poco engorrosa. Para ser justos, el módulo de subproceso de Python parece estar lleno de toneladas de diversión, por lo que es comprensible que sea un poco pesado de manejar. Para ser más justo con Python, hay otras formas de hacer lo anterior en Python utilizando métodos en módulos y bibliotecas que la documentación recomienda que ya no use. Ejecutar comandos en PowerShell en la línea de comandos y con el operador call (&) se siente fácil, pero parte de la razón es porque PowerShell está destinado a ser un shell nativo para Windows. Casi parece injusto, como comparar cómo ejecuta comandos en ksh versus bash versus cmd. En realidad, cuando compara bash con PowerShell o incluso cmd con PowerShell, PowerShell tiene tales peculiaridades que probablemente perdería esa batalla.
Fuente: Aprender un nuevo idioma – Perl, Python y PowerShell – Parte I – Ejecutar un comando del sistema
Para abreviar una tienda larga, en mi humilde opinión, a la larga es más barato quedarse con un proveedor, muchas veces he estado en llamadas de problemas que todos culpan a la otra compañía de los errores. Los mainframes estarán disponibles por mucho tiempo, Windows también, en cuanto a hardware en este momento solo compraría HP / Proliant’s, Cisco. Se requiere menos sobrecarga que una tecnología de combinación y combinación, es más fácil encontrar técnicos que puedan admitir equipos Windows y Cisco en lugar de ser buenos en todo.
Haters: eres bienvenido a cualquier contraargumento, lo he escuchado todo.