Search code examples
windowspowershellbatch-filecmdenvironment-variables

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?


Solution

  • 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.