Saltar al contenido

¿Cómo llamar al script por lotes desde Powershell?

Contamos con tu apoyo para compartir nuestras reseñas acerca de las ciencias de la computación.

Solución:

Si toma las Extensiones de la comunidad de PowerShell, hay un comando Invoke-BatchFile que ejecuta el archivo por lotes pero, lo que es más importante, conserva las modificaciones de las variables de entorno realizadas por el archivo por lotes, por ejemplo:

>Invoke-BatchFile 'C:Program Files (x86)Microsoft Visual Studio 9.0VCvcvarsall.bat'
Setting environment for using Microsoft Visual Studio 2008 x86 tools.

La idea surge de esta publicación de blog: Nada lo resuelve todo: PowerShell y otras tecnologías

Aquí está mi versión de este script. Llama a un archivo por lotes (o cualquier nativo comando) y propaga su entorno:


ACTUALIZACIÓN: La versión mejorada y mejor probada de este script 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"


PD Aquí está la propuesta para agregar una capacidad similar a PowerShell: Ampliar el concepto de fuente de puntos a archivos cmd

¿Es posible convertir su script por lotes en un script de PowerShell? Si ejecuta el archivo bat, se ejecuta en una sesión separada que no modifica las variables env de PowerShell.

Puede trabajar con variables env sin problemas:

PS> Get-ChildItem env:

Name                           Value
----                           -----
ALLUSERSPROFILE                C:ProgramData
APPDATA                        C:UsersxyzAppDataRoaming
CommonProgramFiles             C:Program Files (x86)Common Files
CommonProgramFiles(x86)        C:Program Files (x86)Common Files
CommonProgramW6432             C:Program FilesCommon Files
COMPUTERNAME                   xyz
ComSpec                        C:Windowssystem32cmd.exe
DXSDK_DIR                      D:prgsdevMicrosoft DirectX SDK (August 2009)
FP_NO_HOST_CHECK               NO
HOMEDRIVE                      Z:
HOMEPATH                       
...

PS> Get-Item env:path
Name  Value
----  -----
Path  c:devCollabNetSubversionClient;C:Windowssystem32;...

O incluso (mucho más breve, solo devuelve string):

PS> $env:path
c:devCollabNetSubversion Client;C:Windowssystem32;...

Puede cambiar la ruta del entorno de esta manera:

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')

Reseñas y puntuaciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *