bat脚本如何获取环境变量字面值(请看问题说明再回答)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bat脚本如何获取环境变量字面值(请看问题说明再回答)?相关的知识,希望对你有一定的参考价值。

我的环境变量中有以下内容
变量:mysql_HOME 值:D:\MYSQL
变量:Path 值:%MYSQL_HOME%\install
如果使用bat执行echo %path%获取到的内容是D:\MYSQL\install

我的问题是如果我想获取%MYSQL_HOME%\install这个值,bat脚本应该怎么写

参考技术A 可以尝试从注册表取值
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path
reg query "HKEY_CURRENT_USER\Environment" /v Path

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

【中文标题】如何将 .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脚本如何获取环境变量字面值(请看问题说明再回答)?的主要内容,如果未能解决你的问题,请参考以下文章

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

jmeter配置环境变量报错,请教大神

如何在 Windows 中使用 shell 脚本永久设置环境变量

windows10定时1分钟执行php脚本,不使用windows的.bat文件

通过bat脚本配置系统环境变量

如何在配置文件中定义的 PowerShell 脚本中设置环境变量?