如何将.bat文件中的变量导入PowerShell脚本?

时间:2013-11-19 17:16:46

标签: windows powershell batch-file cmd environment-variables

我正在用PowerShell替换部分.bat脚本。批处理文件的配置是通过set适当的环境变量的文件完成的。我正在寻找一种方法将这些变量值加载到.ps1脚本中,而不修改.bat文件(因为它们也在其他地方使用。

示例.bat如下所示:

set VAR_ONE=some_value
set VAR_TWO=/other-value

在批处理脚本中,我只是CALL配置文件,变量可用。我尝试过点源(. filename.bat)和调用(& filename.bat)来自PowerShell的配置文件,这些都不会使变量可见。尝试使用$VAR_ONE$env:VAR_ONE语法访问它们。

在不修改磁盘格式的情况下加载此类配置文件的好方法是什么?

5 个答案:

答案 0 :(得分:9)

如果您使用的是PowerShell Community Extensions,则会Invoke-BatchFile执行此操作。我使用Visual Studio vcvarsall.bat文件来配置我的PowerShell会话以使用Visual Studio工具。

答案 1 :(得分:6)

我会解析它们(只是跳过所有不以set开头的行并用第一个=字符拆分它们。你可以从小的C#cmdlet或直接用小的PowerShell脚本:

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

我有这个代码,我确信它来自某个地方,但信用已经丢失,我想它来自Power Shell Community Extensions Invoke-Batch脚本。

答案 2 :(得分:4)

首选选项是将配置更改为.ps1文件,并将变量定义更改为PowerShell语法:

$VAR_ONE = 'some_value'
$VAR_TWO = '/other-value'

然后你就可以点源文件了:

. filename.ps1

如果您想坚持使用目前的格式,则必须解析这些值,例如:像这样:

Select-String '^set ([^=]*)=(.*)' .\filename.bat | ForEach-Object {
    Set-Variable $_.Matches.Groups[1].Value $_.Matches.Groups[2].Value
}

注意:以上内容在v3之前的PowerShell版本中无效。兼容v2的版本如下所示:

Select-String '^set ([^=]*)=(.*)' .\filename.bat | ForEach-Object {
    $_.Matches
} | ForEach-Object {
    Set-Variable $_.Groups[1].Value $_.Groups[2].Value
}

答案 3 :(得分:1)

假设.bat被称为test.bat,请定义testps.ps1

$lines = cat "test.bat"
$output = @{};

foreach ($line in $lines) {
    $bits = $line.Split("=");
    $name = $bits[0].Split(" ")[1];
    $val = $bits[1];
    $output[$name] = $val
}

return $output

然后结果如下:

C:\temp> .\testps.ps1

Name                           Value
----                           -----
VAR_TWO                        /other-value
VAR_ONE                        some_value


C:\temp> $x = .\testps.ps1
C:\temp> $x

Name                           Value
----                           -----
VAR_TWO                        /other-value
VAR_ONE                        some_value


C:\temp> $x["VAR_ONE"]
some_value

可能有一种更好的分割方式(如果我发现它会编辑)

答案 4 :(得分:1)

您可以通过首先call配置文件和然后执行PowerShell脚本的批处理文件来执行此操作。