我有一个批处理文件,我想调用一个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")
当我运行它时,不会填充环境变量。
如何使它正常工作?
答案 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。下方链接:
答案 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