【问题标题】:Powershell environment variablePowershell 环境变量
【发布时间】:2019-06-08 21:26:57
【问题描述】:

在 Powershell 脚本中 (.ps1) 从控制台的命令行启动 (cmd.exe)

如何在控制台设置和环境变量,
这样当 Powershell 脚本结束处理时,
并退出到被调用的控制台...
环境变量存在,
并且可以通过批处理文件读取,
还是用 SET 命令查看?

不想设置“机器”或“用户”变量...
只有一个控制台进程变量...
如果您在控制台中使用 SET,您将获得相同的变量

【问题讨论】:

    标签: powershell variables environment


    【解决方案1】:

    cmd.exe 运行 PowerShell 脚本总是需要一个 (powershell.exe / pwsh.exe)子进程,而子进程基本上不能设置其进程的环境变量[1]

    最好的办法是让你的*.ps1 文件输出所需环境变量的名称和值,然后调用cmd.exe 进程根据该输出创建它

    安全说明:只有在您信任 该命令不输出恶意定义。

    这是一个简单示例(直接从交互式cmd.exe 会话运行):

    for /f "delims== tokens=1,*" %v in ('powershell.exe -c "'FOO=bar'"') do @set "%v=%w"
    

    上面定义了环境变量%FOO%,其值为bar,基于输出文字名称-值对FOO=bar的PowerShell命令。 使用echo %FOO% 进行验证。

    要将这种方法扩展到定义多个环境变量,请使命令在其自己的行上输出每个定义(在 PowerShell 中,您可以通过输出 字符串数组):

    for /f "delims== tokens=1,*" %v in ('powershell.exe -c "'FOO=bar', 'BAZ=bam'"') do @set "%v=%w"
    

    上面额外定义了%BAZ%,其值为bam


    为了更方便,我建议创建一个执行上述操作的包装批处理文件 (*.cmd)

    • 请注意,您必须在此处使用%%v%%w 而不是%v%w

    • 使用 -File*.ps1 文件的路径来调用它,而不是 -c(对于 -Command)和演示命令。

      • 还可以考虑使用 -NoProfile 来绕过加载 PowerShell 环境的 $PROFILE 文件,这不仅会减慢速度,而且可能会污染命令的输出。

    [1] 正如LotPings 所指出的,子进程继承了父进程环境变量的副本。父母永远不会看到对这些副本的修改。子进程根本无法修改其父的环境,这是OS级别的限制 - 有充分的理由:通过任意(子) 过程将是一个严重的安全问题。

    【讨论】:

    • @ZEE:LotPings 是正确的:此限制是操作系统级别的限制(不仅仅是在 Windows 上),它的存在是有充分理由的 - 请参阅我添加到答案中的脚注。我还修改了解决方案,不仅输出值,还输出要定义的环境变量的 name
    • Understable... 但因为这是一个 MS 的东西... CMD/BATCH 控制台仍然无处不在... 并且有许多从 CMD.exe 命令行调用的 os Powershell 脚本。 ..我希望他们对此有所了解...并提出解决方案... ;-)
    • @ZEE:如果您需要一个简单的解决方案,请坚持使用给定的 shell:使用 cmd.exe,使用批处理文件设置环境变量;使用 PowerShell,使用 *.ps1 文件;在这两种情况下,批处理文件/脚本运行in-process。正如解释的那样,从 cmd.exe 调用 PowerShell 通常可以正常工作,只是不适用于您的特定场景。在这种情况下,此答案(或其变体)中的解决方案是您最好的选择。
    猜你喜欢
    • 2020-05-21
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2016-01-11
    • 2013-02-22
    相关资源
    最近更新 更多