从批处理调用PowerShell,并检索脚本中设置的临时环境变量的新值?

Nic*_*ill 8 variables environment powershell scripting batch-file

我希望标题简洁明了,但以防万一:

我从批处理文件中调用PowerShell脚本.我希望PowerShell脚本设置环境变量的值,并在PowerShell脚本完成时使该新值在批处理文件中可用.

我知道可以在PowerShell中使用$ env设置环境变量,但是当PowerShell脚本终止时,该值不会保留.我想这可能是因为PowerShell在一个单独的进程中执行.

我知道我可以返回退出代码并使用%ErrorLevel%,但这只会给我数字,并且会有冲突,因为1表示PowerShell异常而不是有用的数字.

现在,这里需要注意的是:我不希望环境变量持续存在.也就是说,我不希望为用户或系统定义它,因此我希望它在批处理文件退出后立即不可用.最后,我只想将结果从PowerShell脚本传递回调用批处理文件.

这可能吗?

提前致谢 :)

缺口

zda*_*dan 10

要获得Keith使用stdout工作的想法,您可以从批处理脚本中调用powershell,如下所示:

FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v"
Run Code Online (Sandbox Code Playgroud)

有点尴尬,但它有效:

C:\>FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v"
C:\>set d
d=August 5, 2010 11:04:36 AM
Run Code Online (Sandbox Code Playgroud)

  • 另外,如果您在批处理文件中而不是从命令行运行此代码,则需要在变量名称前面使用双百分号(即将上例中两个位置的 %v 更改为 %%v) 。 (2认同)

Kei*_*ill -2

从 PowerShell 捕获结果的最直接方法是在 PowerShell 中使用 stdout。例如,这会将日期保存到 cmd.exe 中的 d env var

set d = powershell -noprofile "& { get-date }"
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复,但我认为上面的方法不起作用?在这种情况下,我期望发生的是环境变量“d”的值将是“powershell -noprofile“& { get-date }””。IE:不计算表达式右侧的内容。 (2认同)