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?
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.
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.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With