Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call batch script from Powershell?

Tags:

I have one big batch script which sets bunch of environment variables. I want to call that batch script from powershell, that way I can get benefits of both i.e. enviorment variable set by my script and powershell.

like image 635
Invincible Avatar asked Dec 08 '10 06:12

Invincible


People also ask

Can we run batch file in PowerShell?

bat file from a PowerShell script, you can run it manually from the PowerShell.


2 Answers

If you grab the PowerShell Community Extensions, there is an Invoke-BatchFile command in it that runs the batch file but more importantly, it retains any environment variable modifications made by the batch file e.g.:

>Invoke-BatchFile 'C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat' Setting environment for using Microsoft Visual Studio 2008 x86 tools. 
like image 137
Keith Hill Avatar answered Sep 28 '22 06:09

Keith Hill


The idea comes from this blog post: Nothing solves everything – PowerShell and other technologies

Here is my version of this script. It calls a batch file (or any native command) and propagates its environment:


UPDATE: Improved and better tested version of this script is here: 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. Here is the proposal to add similar capability to PowerShell: Extend dot sourcing concept to cmd files

like image 30
Roman Kuzmin Avatar answered Sep 28 '22 07:09

Roman Kuzmin