bat脚本如何获取环境变量字面值(请看问题说明再回答)?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bat脚本如何获取环境变量字面值(请看问题说明再回答)?相关的知识,希望对你有一定的参考价值。
我的环境变量中有以下内容
变量:mysql_HOME 值:D:\MYSQL
变量:Path 值:%MYSQL_HOME%\install
如果使用bat执行echo %path%获取到的内容是D:\MYSQL\install
我的问题是如果我想获取%MYSQL_HOME%\install这个值,bat脚本应该怎么写
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 脚本?
如何在 Windows 中使用 shell 脚本永久设置环境变量