我怎样才能从一个.bat文件variables的PowerShell脚本?

我用PowerShellreplace.bat脚本的部分。 batch file的configuration是通过set适当的环境variables的文件完成的。 我正在寻找一种方法来将这些variables值加载到.ps1脚本中,而无需修改.bat文件(因为它们也在其他地方使用。

一个例子.bat如下所示:

 set VAR_ONE=some_value set VAR_TWO=/other-value 

在批处理脚本中,我只是CALLconfiguration文件,variables将可用。 我已经尝试了源代码( . filename.bat )和调用( & filename.bat )来自PowerShell的configuration文件,这些都没有使variables可见。 尝试使用$VAR_ONE$env:VAR_ONE语法访问它们。

加载这样的configuration文件,而不修改磁盘上的格式是一个好的方法?

Solutions Collecting From Web of "我怎样才能从一个.bat文件variables的PowerShell脚本?"

我将解析它们(只是跳过所有不以set开始的行,并用first = character来分隔它们,你可以从小的C#cmdlet或者直接用一个小的PowerShell脚本来完成:

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

我有这个代码,我确定它来自某处,但学分已经丢失,我想它是来自Power Shell社区扩展的一个Invoke-Batch脚本。

如果您使用PowerShell社区扩展 ,它有一个Invoke-BatchFile来执行此操作。 我使用Visual Studio vcvarsall.bat文件将PowerShell会话配置为使用Visual Studio工具。

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

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

然后你就可以点击这个文件:

 . filename.ps1 

如果你想坚持你现在使用的格式,你必须解析这些值,例如:

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

注意:上述功能在v3之前的PowerShell版本中不起作用。 与v2兼容的版本将如下所示:

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

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

有可能是一个更好的方式做分裂(将编辑,如果我找到它)

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