0

我有一个批处理文件,我想调用一个将多个值返回到批处理文件的 powershell 脚本。

我试图通过设置环境变量来做到这一点,但这不起作用。

这是批处理文件:

::C:\temp\TestPScall.bat
@echo off
powershell -executionpolicy Bypass -file "c:\temp\PStest.ps1"
@echo [%psreturncode%]
@echo [%uservar%]
@echo [%processvar%]

这是powershell脚本:

# c:\temp\PStest.ps1
$env:psreturncode = "9990"
[Environment]::SetEnvironmentVariable("UserVar", "Test value.", "User")
[Environment]::SetEnvironmentVariable("ProcessVar", "Test value.", "Process")

当我运行它时,不会填充环境变量。

我怎样才能让它工作?

4

3 回答 3

0

有powershell调用cmd或bat文件吗?

C:\users\js> powershell $env:a = 'there'; cmd
Microsoft Windows [Version 10.0.16299.1150]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\users\js> echo %a%
there
于 2019-06-04T17:43:50.407 回答
0

如上面评论中所述,每个会话都会更改环境变量。因此,您必须cmd在 PS 脚本运行后启动一个新实例。或者,您也可以尝试refreshenv从 cmd 调用,但我不确定这是否可行,因为 docu 声明它将重新加载注册表中的值。

如果您想以持久的方式更改环境变量,则必须通过系统设置更改它们。

关于环境变量

要对环境变量进行持久更改,请使用控制面板中的系统(高级选项卡或高级系统设置项)将更改存储在注册表中。

在 PowerShell 中更改环境变量时,更改仅影响当前会话。此行为类似于基于 Windows 的环境中的 Set 命令和基于 UNIX 的环境中的 Setenv 命令的行为。

于 2019-06-04T16:38:02.490 回答
0

让我们谈谈为什么这不起作用。

CMD 在应用程序启动时加载其环境变量。

因此,当您在 Powershell 中更新环境变量然后尝试从同一个脚本中调用它们时,它找不到它们,因为它们没有加载到 CMD 中。

如果您重新启动 CMD,这些环境变量将存在。

有一些应用程序可以解决这个问题,并在 CMD 中设置环境变量而无需重新启动。

AS Moerwald 表示您可以使用refreshenv,但这不是 Windows 中的内置命令。那来自巧克力。下方链接 :

Chocolatey 的 RefreshEnv.cmd很受欢迎。

于 2019-06-04T16:50:12.607 回答