如何从批处理文件调用Powershell脚本并将多个值返回到批处理文件?

时间:2019-06-04 16:08:37

标签: powershell batch-file

我有一个批处理文件,我想调用一个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")

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

如何使它正常工作?

3 个答案:

答案 0 :(得分:0)

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

如果要永久更改环境变量,则必须通过系统设置进行更改。

来自about environment variables

  

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

     

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

答案 1 :(得分:0)

让我们讨论为什么它不起作用。

CMD在应用程序开始时加载其环境变量。

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

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

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

根据Moerwald的说法,您可以使用refreshenv,但这不是Windows中的内置命令。那来自Chocolatey。下方链接:

chocolatey's RefreshEnv.cmd是受欢迎的。

答案 2 :(得分: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