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

Posted

技术标签:

【中文标题】如何将 .bat 文件中的变量导入 PowerShell 脚本?【英文标题】:How can I source variables from a .bat file into a PowerShell script? 【发布时间】:2013-12-03 09:01:30 【问题描述】:

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

.bat 的示例如下所示:

set VAR_ONE=some_value
set VAR_TWO=/other-value

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

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

【问题讨论】:

【参考方案1】:

我会解析它们(只需跳过所有不以 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】:

首选选项是将配置更改为 .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

【讨论】:

@skolima 请不要对其他人的答案进行重大更改。谢谢。【参考方案3】:

假设.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】:

你可以通过一个批处理文件来做到这一点,首先call配置文件,然后然后执行PowerShell脚本。

【讨论】:

【参考方案5】:

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

【讨论】:

这确实是更好的答案,因为它允许从任何批处理文件中获取变量,即使是具有逻辑或调用其他文件的文件。

以上是关于如何将 .bat 文件中的变量导入 PowerShell 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将.ts文件中的变量导入.js文件

在.bat脚本中如何将一个命令的返回结果传给一个变量?

bat脚本如何将命令执行的结果赋值给变量

如何从bat脚本变量中的父文件夹中删除子文件夹和文件?

我有一堆sql文件需要运行 如何批量运行

从另一个文件导入变量?