我正在用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
语法访问它们。
在不修改磁盘格式的情况下加载此类配置文件的好方法是什么?
答案 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脚本的批处理文件来执行此操作。