在PowerShell脚本中设置用户环境变量的正确方法是什么?

9
我正在尝试使用Windows计划程序在PowerShell脚本中安排一个命令运行。此命令依赖于用户特定的环境变量,由于计划任务无法访问这些变量,因此我决定尝试在PowerShell脚本内部设置变量。
正常的环境变量配置如下:

Enter image description here

为了在脚本中复制它,我尝试使用:
$env:DCRCLIFILE = "C:\Users\pzsr7z\Desktop\DCRCLIFILE.txt"

但出于某种原因,当我按这种方式设置时,程序无法正常工作,即使在使用“正常”的用户环境变量运行程序时也可以完美地工作。
使用PowerShell启动的环境变量执行程序。

Image description

使用“正常”环境变量进行程序执行:

Enter image description here

在PowerShell脚本中设置环境变量时,我是否需要做出任何不同的操作?我不确定为什么这样不起作用。我已经验证了环境变量确实被创建了,所以这不是PowerShell命令失败的问题。

“因为计划任务无法访问这些内容” - 你是从哪里得到这个印象的? - Bill_Stewart
@Bill_Stewart当我创建变量时,我只是以我的普通用户身份登录,然后进入控制面板、系统、高级系统设置,并在“pzsr7z的用户变量”部分设置了该变量。对于计划任务,我只是创建了任务,并将用户保留为默认用户gxx\pzsr7z。因此,同一用户既创建又使用变量。如果有任何区别的话,计划任务在我注销服务器时运行(一旦我让它工作起来,它每天执行一次)。 - lacrosse1991
@Bill_Stewart 嗯,好的。你能想到任何可能阻止我访问它们的原因吗? - lacrosse1991
@Bill_Stewart 好的,我需要再做一些研究。不过感谢你帮忙测试,我很感激。 - lacrosse1991
@Bill_Stewart 嘿,我想让你知道我找到了一种方法来解决这个问题。我没有直接从powershell调用dcrcli.exe程序,而是创建了一个单独的批处理文件,该文件设置DCRCILFILE变量,然后再调用dcrcli。不确定为什么这种方法在powershell中无法工作,但现在它已经可以正常工作了。 - lacrosse1991
显示剩余6条评论
2个回答

23
$env:DCRCLIFILE = "C:\Users\pzsr7z\Desktop\DCRCLIFILE.txt"

这只会创建一个进程级别的环境变量,它只可见于当前的PowerShell会话,并且只存在于会话期间。

您需要使用.NET Framework和SetEnvironmentVariable方法来设置更长久的环境变量(用户级或机器级):

[Environment]::SetEnvironmentVariable("DCRCLIFILE", "C:\Users\pzsr7z\Desktop\DCRCLIFILE.txt", "User")

1
那会立即生效吗?当我运行该命令时,我必须注销然后重新登录才能使变量可用。 - lacrosse1991
环境变量通常只在进程启动时读取,如果您对它们进行更改,则需要在进程重新启动之前才能看到更改。 - henrycarteruk
1
那么,使用Windows计划程序运行时,最好的方法是什么?在创建环境变量后,我需要重新启动PowerShell,但是在重启之后,我是否无法访问新的变量,因为计划任务无法访问用户创建的环境变量? - lacrosse1991
你尝试将 Env Var 设置为机器变量了吗? - henrycarteruk
如果可能的话,我更愿意避免这种情况,因为其他人也会使用这个服务器,所以将此变量全局可用会干扰他们尝试运行我在帖子中展示的dcrcli.exe命令时的操作。 - lacrosse1991
你是否已将计划任务设置为在创建环境变量的相同帐户下运行? - henrycarteruk

0

我最终通过创建一个单独的批处理文件并手动设置DCRCLIFILE变量来解决了这个问题,然后在同一批处理文件中运行dcrclifile.exe命令。

我不确定为什么在尝试在PowerShell中手动设置变量时事情没有正常工作。


我也不知道。在PowerShell中,它对我来说运行得很好。 - Bill_Stewart

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