在Windows PowerShell中设置环境变量

8
我在尝试从CMD复制这个命令set APPDATA=D:\,但遇到了麻烦。
最接近的等价命令是Set-Variable -Name $env:APPDATA -Value D:\。但这个命令并不起作用!
完整的脚本如下:
set APPDATA=D:\
start java -jar D:\.minecraft\minecraft.jar

这将使Java在D:\中寻找.minecraft而不是APPDATA

完整的PowerShell版本(无法正常工作)如下:

& Set-Variable -Name $env:APPDATA -Value D:\
& 'C:\Program Files\Java\jre1.8.0_66\bin\java.exe' -jar D:\.minecraft\Minecraft.jar

它仍然查看只读版本的$env:APPDATA。我不明白为什么不能在运行环境中更改,如cmd和大多数*nix shells的会话!

我相信这不仅仅是运行Minecraft的用途。 :P


我不认为这是重复的,因为另一个问题根本没有提到 Set-Variable - Eris
1
这可能是因为Set-Variable用于设置PowerShell变量,而不是用于设置环境变量。 - Ansgar Wiechers
另一个问题实际上没有在任何答案中说明Set-Variable不适用于环境变量,也没有在问题中提到。虽然解决方案相似,但它不是重复的问题。 - Eris
虽然您关于 Set-Variable 的观点是正确的,但遗憾的是,“如何使用 PowerShell 设置环境变量”的问题已经被问了多次,而我们没有一个可以链接到的规范问题。 - sodawillow
相关帖子 - Powershell 添加系统变量 - RBT
1个回答

10

当您使用Set-Variable命令时,-Name参数不应该包含美元符号($)

# WRONG: Set's the variable using the name stored in ENV:APPDATA
Set-Variable -Name $env:APPDATA -Value D:\

此外,Set-Variable 似乎无法像预期的那样与环境变量一起使用。我认为这是因为 Set-Variable 被专门设计为与 Variable: 变量提供程序一起工作,而不是与 env: 环境提供程序一起工作。(我在本地验证了这一点,使用 Set-Variable -Name ENV:AppData -Value "foo" 创建了一个名为 'ENV:AppData' 的变量在 Variable: 提供程序中。)

$ENV:AppData="D:\"
& 'C:\Program Files\Java\jre1.8.0_66\bin\java.exe' -jar D:\.minecraft\Minecraft.jar

备选方案2(使用C# API):

[Environment]::SetEnvironmentVariable("APPDATA", "D:\")

非常感谢!我确实查找了一些资料,但是没有找到任何有用的信息。我对Powershell还比较新,不知道Variable:提供程序和Environment提供程序之间的区别。我开始猜测可能存在局部变量和全局环境变量之分,但是在微软的官方文档中没有找到相关说明,或者我没有找对地方。 - Whitequill Riclo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接