¿Cómo ejecutar un archivo por lotes desde un script de PowerShell?
Los archivos por lotes proporcionan una forma práctica de agrupar comandos, automatizar tareas y ejecutar scripts en Windows. ¿Pero sabía que también puede llamar archivos por lotes directamente desde scripts de PowerShell? Los archivos por lotes son scripts simples que pueden automatizar una serie de tareas y, cuando se combinan con PowerShell, se convierten en una herramienta poderosa. En esta guía paso a paso, exploraremos los pormenores de la ejecución de archivos por lotes y comandos CMD desde PowerShell. Comenzaremos entendiendo qué es un archivo por lotes y cómo funciona. Luego pasaremos a los beneficios de ejecutar archivos bat desde PowerShell y los diferentes comandos de PowerShell que se pueden utilizar para este propósito. Aprenderá varios métodos para iniciar scripts por lotes, pasar argumentos, asignar resultados y automatizar operaciones por lotes completamente desde PowerShell.
Ya sea que desee migrar scripts por lotes heredados a PowerShell o combinar los dos para una automatización del siguiente nivel, esta guía lo tiene cubierto. ¡Síguenos mientras desbloqueamos todo el potencial de PowerShell y los scripts por lotes juntos!
¿Qué es un archivo por lotes y cómo funciona?
Antes de comenzar, primero comprendamos qué es un archivo por lotes. Un archivo por lotes es un script simple que contiene una serie de comandos que se ejecutan en secuencia en el sistema operativo Windows. Estos comandos se pueden utilizar para realizar una amplia gama de tareas, incluidas operaciones de archivos, operaciones de carpetas, operaciones del sistema y más. Generalmente se guarda con una extensión .bat o .cmd y se puede ejecutar haciendo doble clic en el archivo. Los archivos por lotes se utilizan para automatizar tareas repetitivas y se utilizan comúnmente en entornos Windows en máquinas locales o remotas. Al llamar scripts y comandos por lotes dentro de PowerShell, se abren posibilidades completamente nuevas para la automatización avanzada y la orquestación del flujo de trabajo.
La sintaxis de un archivo por lotes es sencilla. Cada comando está escrito en una línea separada y se pueden agregar comentarios usando la palabra clave REM. Los archivos bat también pueden usar variables, que se pueden configurar usando la palabra clave SET. Luego, estas variables se pueden usar en el archivo por lotes para almacenar y recuperar valores.
Beneficios de ejecutar archivos por lotes desde PowerShell
La ejecución de archivos por lotes desde PowerShell proporciona varios beneficios. Primero, nos permite utilizar las poderosas capacidades de secuencias de comandos de PowerShell para automatizar nuestras tareas. PowerShell proporciona un amplio conjunto de comandos y funciones que se pueden utilizar para manipular archivos, carpetas y configuraciones del sistema. Al usar PowerShell para ejecutar archivos por lotes, podemos combinar estos comandos y funciones con los comandos de nuestro archivo por lotes para crear scripts potentes.
En segundo lugar, ejecutar archivos por lotes desde PowerShell proporciona un mejor control y manejo de errores. PowerShell proporciona un sólido mecanismo de manejo de errores que nos permite manejar los errores con elegancia. Podemos usar la construcción Try-Catch-Finally para detectar y manejar errores que ocurren durante la ejecución de nuestro archivo bat.
Finalmente, al llamar archivos por lotes desde PowerShell, podemos aprovechar las funciones de seguridad proporcionadas por PowerShell. PowerShell proporciona varias funciones de seguridad, incluidas políticas de ejecución, que se pueden utilizar para controlar la ejecución de scripts y evitar que se ejecuten scripts maliciosos en nuestro sistema.
¿Por qué ejecutar archivos por lotes desde PowerShell?
Existen algunas buenas razones para ejecutar archivos por lotes desde PowerShell en lugar de hacerlo de forma independiente:
- Automatice flujos de trabajo complejos combinando lotes y PowerShell
- Migrar scripts por lotes existentes a PowerShell
- Evite cambiar de contexto para ejecutar operaciones por lotes
- Encapsular y reutilizar operaciones por lotes en módulos de script
PowerShell ofrece funcionalidades avanzadas que no están presentes en los archivos por lotes. Entonces, ¿por qué no conseguir lo mejor de ambos mundos? Al invocar archivos por lotes directamente desde PowerShell, obtiene control total y capacidad de secuencias de comandos sin necesidad de ejecutar manualmente trabajos por lotes por separado.
¿Cómo ejecutar un archivo por lotes desde PowerShell?
Ejecutar un archivo por lotes desde PowerShell es un proceso sencillo. PowerShell proporciona varios comandos que se pueden usar para ejecutar archivos por lotes. Echemos un vistazo a algunos de los comandos más utilizados:
Método 1: cmdlet de inicio del proceso
Podemos usar el cmdlet Start-Process para ejecutar un archivo por lotes. La sintaxis del cmdlet Start-Process es la siguiente:
Start-Process -FilePath <path-to-batch-file> -ArgumentList <arguments> -Wait
El parámetro -FilePath especifica la ruta al archivo por lotes, mientras que el parámetro -ArgumentList especifica los argumentos que deben pasarse al archivo por lotes como una matriz de cadenas. El parámetro -Wait especifica que PowerShell debe esperar a que se complete el archivo por lotes antes de continuar.
Ejemplo: ejecutar un archivo Bat desde un script de PowerShell
Comencemos con un ejemplo sencillo. Digamos que tenemos un archivo por lotes llamado Backup-Database.bat que queremos ejecutar desde PowerShell. Podemos llamarlo usando el cmdlet Start-Process:
Start-Process -FilePath "C:\Temp\Backup-Database.bat" -Wait
Esto ejecutará el archivo bat en una ventana de símbolo del sistema separada y esperará a que se complete antes de continuar.
Archivo por lotes con espacio en el nombre
Si el nombre de su archivo por lotes contiene espacios, rodéelo entre comillas dobles:
Start-Process -FilePath "C:\Scripts\Deploy App.bat" -Wait -NoNewWindow
Esto pasa la ruta completa del archivo por lotes a cmd.exe como un único argumento. El parámetro "NoNewWindow" le indica a PowerShell que ejecute el archivo bat en la ventana actual sin abrir otra ventana. Para obtener más información sobre el cmdlet Start-Process, consulte: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.2
Método 2: el operador &
El operador & (también conocido como operador de llamada) se utiliza para ejecutar un comando como si fuera una función de PowerShell. Podemos usar el operador & para ejecutar un archivo por lotes. La sintaxis es la siguiente:
& <path-to-batch-file>
A continuación se muestra un ejemplo de cómo utilizar el operador & para ejecutar un archivo por lotes:
& "C:\Scripts\deploy-app.bat"
Método 3: cmdlet Invocar elemento
El cmdlet Invoke-Item abre un archivo o carpeta en su aplicación asociada. Podemos usar el cmdlet Invoke-Item para ejecutar un archivo por lotes. La sintaxis es la siguiente:
Invoke-Item <path-to-batch-file>
A continuación se muestra un ejemplo de cómo utilizar el cmdlet Invoke-Item para ejecutar un archivo por lotes:
Invoke-Item "C:\Scripts\deploy-app.bat"
También puede utilizar el cmdlet del comando Invome:
Invoke-Command -ScriptBlock { C:\Scripts\deploy-app.bat }
Método 4: ejecutar archivos por lotes con CMD.exe
Otro enfoque es invocar la ventana cmd y pasar el archivo por lotes para ejecutar. Ejecutar un archivo por lotes usando cmd.exe desde un entorno PowerShell es relativamente sencillo. A continuación se muestran algunos ejemplos para mostrar cómo hacer esto:
cmd.exe /c C:\Scripts\deploy-app.bat
También puede ejecutar lógica condicional dentro de los comandos por lotes:
cmd.exe /c "echo 'Is it raining? (yes/no)' && set /p answer= && if '%answer%'=='yes' (echo 'Take an umbrella!') else (echo 'Enjoy the weather!')"
Todos estos métodos funcionan con cualquier otro host como PowerShell ISE, Visual Studio Code, etc.
Llamar a un archivo por lotes desde la consola PowerShell
Veamos los pasos para ejecutar un archivo por lotes en PowerShell.
- Paso 1: abra PowerShell: para comenzar, abra PowerShell en su computadora con Windows. Puede hacerlo buscando "PowerShell" en el menú Inicio o presionando la tecla de Windows y escribiendo "PowerShell" en la barra de búsqueda.
- Paso 2: navegue hasta el directorio que contiene el archivo por lotes: una vez que PowerShell esté abierto, debe navegar hasta el directorio que contiene el archivo por lotes que desea ejecutar. Para hacer esto, use el comando "cd" seguido de la ruta al directorio. Por ejemplo, si su archivo por lotes se encuentra en la carpeta "Documentos", deberá ingresar "cd C:\Scripts".
- Paso 3: Ejecute el archivo por lotes: después de navegar al directorio correcto, ejecute el archivo por lotes escribiendo el nombre del archivo seguido de ".bat". Por ejemplo, si su archivo por lotes se llama "Deploy-App.bat", ingresaría "Deploy-App.bat" en PowerShell y presionaría Enter.
- Paso 4: comprobar si hay errores: una vez que haya ejecutado el archivo por lotes, compruebe si hay errores en PowerShell. Si no hay errores, el archivo por lotes debería haberse ejecutado correctamente.
Ejecutar archivos por lotes con parámetros
Los archivos por lotes pueden aceptar argumentos, que se les pueden pasar en tiempo de ejecución. También podemos pasar argumentos a un archivo por lotes cuando lo ejecutamos desde PowerShell. Para pasar argumentos a un archivo por lotes, necesitamos usar el parámetro -ArgumentList con el cmdlet Start-Process. La sintaxis es la siguiente:
Start-Process -FilePath <path-to-batch-file> -ArgumentList <arguments>
Puede acceder a los argumentos utilizando los tokens %1, %2, etc. dentro de su script por lotes. P.ej.
@echo off
IF "%1"=="install" (
echo Installing the program...
REM Install the application
echo Done!
)
IF "%2"=="silent" (
echo Using Silent mode...
echo Done!
)
echo App Deployment has been complete!
Pause
El comando echo en el archivo bat es equivalente a Write-Output en PowerShell. A continuación se muestra un ejemplo de cómo pasar argumentos a un archivo por lotes:
Start-Process -FilePath 'C:\Scripts\deploy-app.bat' -ArgumentList "install", "silent"
En este ejemplo, pasamos dos argumentos al archivo por lotes.
Asignación de salida de archivos por lotes
Capturar el resultado de un archivo por lotes cuando se ejecuta desde PowerShell puede resultar muy útil para registrar, depurar o procesar datos adicionales. Para capturar el resultado del archivo por lotes, almacene el resultado Start-Process en una variable:
Start-Process -FilePath 'C:\Scripts\deploy-app.bat' -RedirectStandardOutput 'C:\Temp\Output.txt' -Wait -WindowStyle Hidden
Esto proporciona una manera fácil de obtener resultados por lotes directamente dentro de PowerShell.
Redirigir la salida a un archivo
Podemos redirigir la salida de un archivo por lotes a un archivo usando el operador
& "C:\Scripts\deploy-app.bat" > "C:\Scripts\output.txt"
En este ejemplo, la salida del archivo por lotes se redirige a un archivo llamado "output.txt".
Usando cmd.exe para capturar la salida
También puede utilizar cmd.exe para capturar el resultado. El indicador /c le indica a CMD.exe que ejecute el comando que le sigue:
$Output = cmd.exe /c C:\Scripts\deploy-app.bat | Out-String
Esto ejecuta implementar-app.bat a través de cmd.exe y pasa la salida estándar a Out-String para convertirla en una cadena en PowerShell.
Ejecución de comandos por lotes en línea en PowerShell
Puede ejecutar comandos por lotes únicos directamente desde PowerShell:
$output = cmd /c "ping localhost -n 3"
Esto hace ping al localhost 3 veces y captura el resultado. Por lo tanto, no necesita un archivo .bat real; también puede ejecutar fragmentos de código por lotes en línea.
Invoke-Expression "cmd.exe /c 'dir C:\Backup'"
Salida del ejemplo anterior:
Llamar archivos por lotes dentro de las funciones de PowerShell
Una vez que haya probado la ejecución por lotes desde PowerShell, considere encapsularla en una función de PowerShell reutilizable.
Function Invoke-DevBatchScript {
$output = Start-Process -FilePath 'C:\Scripts\deploy-app.bat' -RedirectStandardOutput 'C:\Temp\Output.txt'
Write-Output $output.StandardOutput
}
Invoke-DevBatchScript
Ahora puede llamar a Invoke-DevBatchScript desde cualquier script de PowerShell para ejecutar su operación por lotes. Esto facilita la integración de flujos de trabajo por lotes en el enfoque modular de PowerShell.
Ejecute el archivo por lotes como administrador en PowerShell
Si su archivo bat requiere privilegios de administrador, puede usar el modificador "-Verb RunAs" en el cmdlet Start-Process:
Start-Process -FilePath "C:\Scripts\deploy-app.bat" -Verb RunAs
¿Cómo ejecutar un script de PowerShell desde un archivo por lotes?
En algunos escenarios, es posible que necesite ejecutar un archivo de secuencia de comandos de PowerShell desde un archivo por lotes. Puede hacer esto utilizando la sintaxis "PowerShell -command 'PowerShell commands' en su archivo por lotes.
Crear un archivo por lotes para ejecutar un script de PowerShell
Crear un archivo por lotes para ejecutar un script de PowerShell es un proceso sencillo. Siga los pasos a continuación para comenzar:
- Abra cualquier editor compatible con PowerShell de su elección, como el Bloc de notas, PowerShell ISE o Visual Studio.
- Para llamar al script de PowerShell, escriba el siguiente comando en el editor de texto: powershell -Archivo “ruta/a/su/script.ps1”. Reemplace "ruta/a/su/script.ps1" con la ruta real a su script de PowerShell. Asegúrese de incluir la extensión de archivo correcta (.ps1).
- Guarde el archivo con una extensión .bat, como "RunScript.bat". Elija una ubicación que sea de fácil acceso.
¡Eso es todo! Ahora ha creado un archivo por lotes que puede ejecutar su script de PowerShell automáticamente. Para ejecutar el archivo bat, simplemente haga doble clic en el archivo por lotes desde el Explorador de archivos y automáticamente llamará al script de PowerShell. O ejecútelo también desde el símbolo del sistema o PowerShell.
Ejecute el script de PowerShell desde un archivo por lotes
La siguiente línea de código envía el resultado de un comando de PowerShell a un archivo de texto.
powershell.exe -Command "Get-Service | Out-File 'C:\Scripts\Services.txt'"
Alternativamente, puede llamar al script de PowerShell en los archivos por lotes como:
powershell.exe -File -noexit "C:\Scripts\BackupScript.ps1"
Para ver el resultado de PowerShell, puede agregar el parámetro -noexit. Esto mantiene abierta la ventana de PowerShell después de ejecutar el script para que pueda ver cualquier resultado.
También puede iniciar una nueva sesión de PowerShell desde su archivo por lotes de esta manera:
PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -File "C:\Scripts\deploy-app.bat"' -Wait}"
Esto abrirá una nueva ventana de PowerShell, ejecutará el script dentro de PowerShell y cerrará la ventana al final del script.
Ejecute el script de PowerShell como administrador desde el archivo por lotes
Para ejecutar un script de PowerShell con derechos administrativos desde un archivo por lotes, use el parámetro -Verb RunAs como se muestra a continuación:
powershell.exe -Command "Start-Process 'C:\Scripts\Backup.ps1' -Verb RunAs"
El código anterior es equivalente a "Ejecutar como administrador" en la GUI de Windows. Hagámoslo un poco más detallado:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File "C:\PathToScript.ps1 %arg1% %arg2%"' -Verb RunAs -Wait}"
Pasar argumentos y variables del archivo por lotes a PowerShell
También puede pasar argumentos y variables del archivo por lotes al script de PowerShell. Por ejemplo, aquí está el archivo bat que llama a un archivo PowerShell PS1:
powershell.exe -File "C:\Temp\Helloworld.ps1" -Name "John"
Luego, en tu script de PS1, accede a él como:
Param(
[string]$Name
)
Write-Output "Hello $Name"
Esto permite que el archivo por lotes pase datos dinámicamente al script.
Solución de problemas comunes al ejecutar archivos por lotes desde PowerShell
La ejecución de archivos por lotes desde PowerShell es generalmente sencilla, pero como cualquier tarea técnica, a veces puede provocar errores o comportamientos inesperados. A continuación se detallan algunos problemas comunes que puede encontrar al ejecutar archivos por lotes desde PowerShell, junto con los pasos para solucionarlos.
Errores de sintaxis
Los archivos por lotes los ejecuta el intérprete de comandos, que es un programa diferente de PowerShell. Por lo tanto, debemos asegurarnos de que los comandos en nuestro archivo por lotes estén escritos con la sintaxis correcta para el intérprete de comandos. Podemos probar nuestro archivo por lotes ejecutándolo desde el símbolo del sistema para asegurarnos de que esté escrito correctamente.
Archivo no encontrado o errores de ruta
PowerShell puede generar un mensaje de error como "El sistema no puede encontrar el archivo especificado". Posibles soluciones: vuelva a verificar la ruta del archivo. Asegúrese de haber navegado a la carpeta que contiene el archivo por lotes o de haber proporcionado la ruta completa al archivo. Compruebe si hay errores tipográficos en el nombre o la ruta del archivo.
Problemas de permisos
Al ejecutar archivos por lotes desde PowerShell, podemos encontrar problemas de permisos si el archivo por lotes requiere privilegios elevados. Ejecute PowerShell como administrador. Para ejecutar un archivo por lotes con privilegios de administrador, podemos usar el cmdlet Start-Process con el parámetro -Verb RunAs. La sintaxis es la siguiente:
Start-Process -FilePath <path-to-batch-file> -Verb RunAs
Asegúrese de que tanto el archivo por lotes como el script de PowerShell se ejecuten con permisos administrativos.
Se ejecuta el archivo por lotes, pero no sucede nada
A veces, el archivo por lotes parece ejecutarse pero no produce el resultado esperado. Puede redirigir la salida del archivo por lotes a un archivo de texto para depurarlo.
Restricciones de la política de ejecución
La ejecución de scripts de PowerShell puede bloquearse debido a la política de ejecución. Para solucionarlo, cambie la política de ejecución del script usando Set-ExecutionPolicy, pero hágalo con cuidado y comprenda las implicaciones.
Mejores prácticas para ejecutar archivos por lotes desde PowerShell
Al ejecutar archivos por lotes desde PowerShell, existen varias prácticas recomendadas que debemos seguir:
Utilice rutas absolutas
Siempre debemos usar rutas absolutas al hacer referencia a archivos o carpetas en nuestros archivos por lotes. Esto garantiza que el archivo por lotes se pueda ejecutar desde cualquier directorio. Aproveche -ArgumentList para pasar argumentos al script por lotes. La ruta relativa podría provocar que se ejecute el archivo incorrecto si el directorio de trabajo actual no es el esperado.
Usar manejo de errores
Deberíamos utilizar el manejo de errores para manejar los errores con elegancia. Esto nos ayuda a identificar y resolver problemas rápidamente. Capture la salida con -PassThru o redirija mediante | Fuera de cadena. Escapar de caracteres especiales como | > con ^si es necesario
Usar comentarios
Deberíamos agregar comentarios en nuestros archivos por lotes para explicar qué hace cada comando. Esto hace que sea más fácil comprender y modificar el archivo por lotes en el futuro.
Conclusión
Ejecutar archivos por lotes desde PowerShell es una forma poderosa de automatizar tareas en Windows. Al usar PowerShell para ejecutar archivos por lotes, podemos aprovechar el poder de ambas herramientas para crear scripts potentes. En esta guía, exploramos el proceso de ejecución de archivos bat desde PowerShell. Hemos analizado los beneficios de ejecutar archivos por lotes desde PowerShell, los diferentes comandos de PowerShell que se pueden usar para ejecutar archivos bat y las técnicas avanzadas y mejores prácticas para ejecutar archivos por lotes desde PowerShell.
Dominar estas técnicas le permite integrar y organizar flujos de trabajo por lotes completamente dentro de scripts de PowerShell. Siguiendo estas técnicas y mejores prácticas, podemos crear scripts eficientes y confiables que automaticen nuestras tareas. ¡Así que adelante, cree un script de PowerShell o un archivo por lotes y tome el control de sus tareas automatizadas!
Otras lecturas
Hay muchas formas de ejecutar un script desde un archivo por lotes o un script de PowerShell. Ya sea que desee ejecutar un archivo bat desde un script de PowerShell o ejecutar un script de PowerShell desde el archivo por lotes, los pasos descritos anteriormente deberían proporcionar un punto de partida sólido. ¡Pero no te detengas aquí! Amplíe sus conocimientos con estas publicaciones relacionadas:
- ¿Cómo ejecutar un ejecutable en PowerShell usando Start-Process?
- ¿Cómo ejecutar un script de PowerShell?
- Cree una tarea programada para ejecutar un script de PowerShell
Preguntas frecuentes:
¿Cómo ejecuto un archivo .bat dentro de un script de PowerShell?
Para ejecutar un archivo .bat desde un trabajo de PowerShell, puede usar el cmdlet Start-Process en PowerShell. He aquí un ejemplo:
Start-Process -FilePath "C:\path\to\file.bat"¿Los archivos por lotes se ejecutan en CMD o PowerShell?
Los archivos por lotes normalmente se ejecutan en el símbolo del sistema (CMD) en los sistemas operativos Windows. Sin embargo, también se pueden ejecutar en PowerShell, que es un lenguaje de programación y shell de línea de comandos más avanzado y potente.
¿Cómo ejecutar un comando de PowerShell usando un archivo por lotes?
Para ejecutar un comando de PowerShell usando un archivo por lotes, puede usar el comando "powershell.exe" seguido del comando de PowerShell que desea ejecutar. Por ejemplo, puede crear un archivo por lotes con el siguiente contenido:
@echo off
powershell.exe -Command "Get-Process"¿Cómo ejecutar un símbolo del sistema de administrador desde un archivo por lotes?
Para ejecutar un símbolo del sistema de administrador desde un archivo por lotes, puede usar el comando runas para ejecutar el archivo por lotes como administrador. Así es como puedes hacerlo:
@echo off
runas /user:Administrator "cmd /c C:\Temp\BackupDb.bat"
¿Cómo ejecutar PowerShell como administrador desde un lote?
Para ejecutar PowerShell como administrador desde un archivo por lotes, puede usar el cmdlet Start-Process con el parámetro -Verb RunAs para iniciar PowerShell con privilegios elevados. Así es como puedes hacerlo:
@echo off
powershell.exe -Command "Start-Process PowerShell -Verb RunAs"


