我正在开发一些函数来为PowerShell中的Visual Studio设置环境变量,然后沿着执行vcvarsXXX.bat批处理文件的路径,然后解析set的输出并查找name = value,然后使用Set -Item在PS端设置这些环境变量。
执行此操作的功能如下:
# from Bruce Payette's book to set the environment variables, slightly modified
function Get-Batchfile ($file) {
$cmd = "`"$file`" & set"
cmd /c $cmd | Foreach-Object {
# variation from Payette's book, use a regex in case the batch file writes some output, only take name=value
if ($_ -match "^(.*?)=(.*)$") {
# make sure they look good
write-host $matches[1] "=" $matches[2]
$name=$matches[1]
$value=$matches[2]
write-host ">>> $name = $value"
Set-Item -path env:$name -value $value
# for some reason the set item below does not seem to work even though the values of $matches look good
#Set-Item -path env:$matches[1] -value $matches[2]
}
}
}
我注意到的问题是在正则表达式匹配之后,如果我调用:
Set-Item -path env:$ matches [1] -value $ matches [2]
但如果我将$ matches分配给$ name和$ value,然后调用:
Set-Item -path env:$ name -value $ value
它按预期工作。
我已经“解决了”这个问题,但我想理解为什么第一个似乎不起作用。我宁愿保持代码更紧凑,也不必创建两个临时变量。
答案 0 :(得分:3)
我认为这与您在字符串中使用这些哈希表引用的情况相同。如果它是对象的属性,则必须使用子表达式 - $($ variable.property)。如果将$ variable.property赋值给变量,则可以在不使用子表达式的情况下使用该变量。它对哈希表条目和数组切片的工作方式相同。
看看这是否效果不佳:
Set-Item -path env:$($matches[1]) -value $($matches[2])