Tengo una gran secuencia de comandos por lotes que establece muchas variables de entorno. Quiero llamar a ese script por lotes de powershell, de esa forma puedo obtener beneficios de ambas, por ejemplo, la variable de entorno establecida por mi script y powershell.Cómo llamar al script por lotes de Powershell?
Respuesta
La idea proviene de esta entrada del blog: Nothing solves everything – PowerShell and other technologies
aquí está mi versión de este script. Se invoca a un archivo por lotes (o cualquier nativa de comandos) y propaga su entorno:
ACTUALIZACIÓN: Mejora y mejor versión a prueba de este guión está aquí: Invoke-Environment.ps1
<#
.SYNOPSIS
Invokes a command and imports its environment variables.
.DESCRIPTION
It invokes any cmd shell command (normally a configuration batch file) and
imports its environment variables to the calling process. Command output is
discarded completely. It fails if the command exit code is not 0. To ignore
the exit code use the 'call' command.
.PARAMETER Command
Any cmd shell command, normally a configuration batch file.
.EXAMPLE
# Invokes Config.bat in the current directory or the system path
Invoke-Environment Config.bat
.EXAMPLE
# Visual Studio environment: works even if exit code is not 0
Invoke-Environment 'call "%VS100COMNTOOLS%\vsvars32.bat"'
.EXAMPLE
# This command fails if vsvars32.bat exit code is not 0
Invoke-Environment '"%VS100COMNTOOLS%\vsvars32.bat"'
#>
param
(
[Parameter(Mandatory=$true)] [string]
$Command
)
cmd /c "$Command > nul 2>&1 && set" | .{process{
if ($_ -match '^([^=]+)=(.*)') {
[System.Environment]::SetEnvironmentVariable($matches[1], $matches[2])
}
}}
if ($LASTEXITCODE) {
throw "Command '$Command': exit code: $LASTEXITCODE"
}
P. S. Esta es la propuesta de añadir capacidad similar a PowerShell: Extend dot sourcing concept to cmd files
Puede ejecutar un script por lotes de Powershell simplemente poniendo su nombre, pero eso no lo ayudará. Las variables de entorno establecidas en el script por lotes solo serán visibles desde ese lote y cualquier lote que ejecute. Una vez que el control vuelve a Powershell, las variables de entorno desaparecen. Puede hacer que el script por lotes ejecute set
al final y luego analizar su salida en las variables de entorno de su PSH.
¿Es posible convertir su script por lotes al script de PowerShell? Si ejecuta el archivo bat, se ejecuta en una sesión separada que no modifica las variables de env de PowerShell.
Se puede trabajar con variables env muy suavemente:
PS> Get-ChildItem env:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\xyz\AppData\Roaming
CommonProgramFiles C:\Program Files (x86)\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME xyz
ComSpec C:\Windows\system32\cmd.exe
DXSDK_DIR D:\prgs\dev\Microsoft DirectX SDK (August 2009)\
FP_NO_HOST_CHECK NO
HOMEDRIVE Z:
HOMEPATH \
...
PS> Get-Item env:path
Name Value
---- -----
Path c:\dev\CollabNet\SubversionClient;C:\Windows\system32;...
O incluso (mucho más corto, sólo devuelve cadena):
PS> $env:path
c:\dev\CollabNet\Subversion Client;C:\Windows\system32;...
Puede cambiar la ruta del entorno como éste:
PS> $env:path += ";c:\mydir"
E incluso puede establecer variables de entorno a nivel de máquina de esta manera:
# fist arg = env variable name, second = value, third = level, available are 'Process', 'User', 'Machine'
PS> [Environment]::SetEnvironmentVariable('test', 'value', 'machine')
Si agarras la PowerShell Community Extensions, hay un comando Invoke-batchfile en ella que se ejecuta el archivo por lotes pero lo más importante, que conserva las modificaciones de variables de entorno hechas por el lote archivo por ejemplo:
>Invoke-BatchFile 'C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat'
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
Bastante bien, tengo que buscar en el src :) – stej
Notas a mí mismo, como se muestra a continuación, 1.Para instalar desde el archivo zip en codeplex, derecha -clic y un botón modal, "desbloquear" aparece; Pinchalo. 2. Descomprime después de desbloquear y luego coloca la carpeta en la ubicación de tus módulos, según $ PSHome \ Modules. http://stam.blogs.com/8bits/2010/06/installing-powershell-community-extensions.html – AnneTheAgile
- 1. ¿Cómo ejecuto un script por lotes desde un script por lotes?
- 2. Bucle script por lotes
- 3. Powershell llamando al script de Powershell
- 4. Uso de Invoke-Command de Powershell para llamar a un archivo por lotes con argumentos
- 5. ¿Llamar a PowerShell por lotes y recuperar el nuevo valor de una variable de entorno temporal establecida en el script?
- 6. ¿Cómo esperar en un script por lotes?
- 7. Creación de trabajos por lotes en PowerShell
- 8. ¿Cómo paso un signo igual cuando llamo a un script por lotes en Powershell?
- 9. Windows script por lotes: cálculo de subcadena
- 10. Llamar al método estático genérico en PowerShell
- 11. Cómo ejecutar un script por lotes (archivo .bat) desde eclipse
- 12. ¿Es posible llamar a un archivo por lotes mientras se compila un script Inno Setup?
- 13. Run R script desde Powershell
- 14. Llamar a múltiples comandos de powershell, por ejemplo, psftp
- 15. Ruta del script powershell actualmente en ejecución
- 16. la automatización de Excel 2007 con Powershell al llamar Workbooks.Add()
- 17. Cómo detener el script por lotes en falla del
- 18. ¿Cómo obtener la versión Java del script por lotes?
- 19. ¿Cómo obtener la ruta del script por lotes en Windows?
- 20. Ejecutar script por lotes antes de la depuración
- 21. Uso bate para iniciar script de PowerShell
- 22. El script de Powershell se atasca, no sale cuando se lo llama desde el archivo por lotes
- 23. ¿Cómo se ejecutan los comandos de powershell desde un archivo por lotes?
- 24. Error al llamar a un ejecutable de terceros desde Powershell al usar un IDE
- 25. ¿Cómo ejecutar un script de PowerShell?
- 26. ¿Cómo puedo llamar al script Perl en la aplicación C#?
- 27. Escapar argumentos cuando pasa% * de escritura de la hornada como $ args al script de PowerShell
- 28. Mysql: ¿Cómo llamar al archivo de script sql desde otro archivo de script sql?
- 29. El servicio se cuelga en WaitForExit después de llamar al archivo por lotes
- 30. Ejecutando un script por lotes en el cierre de Windows
Es posible que desee utilizar simplemente '$ Comando> nul 2> & 1 && set' si acaso' $ Command' tiene un código de salida distinto de cero, pero todavía cambia el medio ambiente. – Joey
La versión vinculada 'mejorada y mejor probada' no funcionó para mí, pero copiar copió el script de esta respuesta. –
Gracias por la alarma. ¿Puedes crear un problema [allí] (https://github.com/nightroman/PowerShelf/issues) y describir tu caso de uso? –