Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I source variables from a .bat file into a PowerShell script?

I'm replacing parts of a .bat script with PowerShell. Configuration for the batch files is done via files that set appropriate environment variables. I'm looking for a way to load those variable values into the .ps1 script, without modifying the .bat files (as they are also used in other places.

An example .bat looks as follows:

set VAR_ONE=some_value
set VAR_TWO=/other-value

In a batch script, I'd just CALL the configuration file and the variables would be available. I've tried both dot-sourcing (. filename.bat) and calling (& filename.bat) the configuration files from PowerShell, neither of those makes the variables visible. Tried accessing them with both with $VAR_ONE and $env:VAR_ONE syntax.

What would be a good way to load such configuration file without modifying it's format on disk?

like image 842
skolima Avatar asked Nov 19 '13 17:11

skolima


People also ask

How do I convert a batch file to a PowerShell script?

A Batch script that doesn't use Batch commands is always convertible to PowerShell by just changing the . cmd/. bat to a . ps1 ending, regardless of length or impact.

Can you open bat files in PowerShell?

It is the latest shell and scripting tool for Windows and a more advanced cmd version. To run a . bat file from a PowerShell script, you can run it manually from the PowerShell.

Can you call a PowerShell script from a batch file?

Use the -File Parameter to Run a PowerShell Script From a Batch File. You can invoke a PowerShell script using the -File parameter. It is the simple command to run a PowerShell script from the command prompt.

How do I pass a parameter to a PowerShell script?

You can pass the parameters in the PowerShell function and to catch those parameters, you need to use the arguments. Generally, when you use variables outside the function, you really don't need to pass the argument because the variable is itself a Public and can be accessible inside the function.


2 Answers

If you are using the PowerShell Community Extensions, it has a Invoke-BatchFile that does this. I use with the Visual Studio vcvarsall.bat file to configure my PowerShell session to use the Visual Studio tools.

like image 71
Keith Hill Avatar answered Sep 19 '22 10:09

Keith Hill


I'd parse them (just skip all lines that don't start with set and split them with first = character. You can do it from o small C# cmdlet or directly with a small PowerShell script:

CMD /c "batchFile.bat && set" | .{process{
    if ($_ -match '^([^=]+)=(.*)') {
        Set-Variable $matches[1] $matches[2]
    }
}}

I have this code and I'm sure it comes from somewhere but credits have been lost, I suppose it comes from Power Shell Community Extensions for an Invoke-Batch script.

like image 20
Adriano Repetti Avatar answered Sep 19 '22 10:09

Adriano Repetti