powershell - 使用 Start-Process 保留环境变量

标签 powershell anaconda conda powershell-core start-process

我首先要说的是,这是 Powershell 的新手。 我目前正在尝试弄清楚如何使用 Start-Process cmdlet 在 Windows 11 中设置环境变量。 我已经尝试过使用管理员权限和不使用管理员权限。 这就是我正在使用的:

启动进程 -FilePath "pwsh"-Verb runAs -ArgumentList "-Command `"& {`"`$env:WATCHDOG_PROCID = (启动进程 C:\Users\acqui\anaconda3\envs\prog\pythonw.exe {C:\Users\acqui\Documents\Programming\Projects\Watchdog\main.py $mode} -PassThru).Id`";暂停}`""

但是,如果该变量尚未存在,则既不会创建,也不会修改(通过从调用子进程的 pwsh 调用 Get-ChildItem Env: 进行检查)。 拥有 WATCHDOG_PROCID 的目的是能够稍后终止该精确进程。

最佳答案

您创建的特定于流程的环境变量仅对 pwsh 可见。外部创建的进程 Start-Process 调用,而不是同时调用调用进程

但是,在您的通话中pwsh定义环境变量后进程自动终止,因此定义丢失。

一种选择是保留 pwsh session 事件并继续那里工作,您可以通过放置 -NoExit 来完成此操作CLI -Command之前的参数.

如果您想在调用过程中定义环境变量,请创建 pwsh调用输出所需的值(从命令中删除 `$env:WATCHDOG_PROCID = ),捕获它并在调用进程中设置它。


注意:没有办法让用户当前操作系统 session 中的所有进程看到新定义的环境变量:

当您持久地定义环境变量时 - 通过 [System.Environment]::SetEnvironmentVariable() ,如this answer所示:

  • 正在运行的进程通常不会接受此更改。

    • 只有当正在运行的进程专门设计用于监听环境变化,并通过重新加载重新定义的环境变量来对其采取行动时,它们才能立即看到变化。
  • 稍后在同一操作系统 session 中创建的进程可能会看到更改,但这取决于它们的启动方式。

    • 例如,稍后从预先存在的 PowerShell session 启动的进程不会看到这些更改,因为它们继承了 PowerShell session 的环境,而 PowerShell 本身设计为选择持久的环境动态变化。

简而言之:

  • 假设您正在尝试定义一个值,该值根据定义仅在当前操作系统 session 中有意义 - 已启动进程的 ID - 使用持久 em> 环境变量不是正确的存储机制,并且必须在每个进程的基础上设置进程范围环境变量。

  • 如果需要了解变量的其他进程在注册表中显式查找定义,您仍然可以使用持久环境变量定义.

    • 或者,您可以指定一个文件来存储该值,或使用自定义注册表位置。

    • 无论哪种方式,当当前操作系统 session 结束时,该信息都会过时,因此您可能需要额外的工作来确定当前保留的值是否与当前操作系统 session 相关(例如比较当持久值写入当前操作系统 session 启动时的时间戳时)。

关于powershell - 使用 Start-Process 保留环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72977586/

相关文章:

python - Jenkins 在构建 conda 包时不包含引用文件

不存在的文件夹上的 PowerShell Get-ChildItem 与 -recurse 标志的行为不同

.net - PowerShell:加载程序集时创建事件处理程序

powershell - 我的 if 语句有问题吗?

powershell - Azure Powershell 错误 - 连接到 Internet

ubuntu - 在 anaconda 中安装包 gcc-7 时发生错误

python - 在 Conda 虚拟环境中使用来自 Github 的包

python - 我可以使用 conda 安装 Python 的 alpha 或 beta 版本吗?

python - `conda install` 报告找不到 `conda search` 找到的包?

python - 为什么 Spyder 在 OS X 中这么慢?有没有办法让它更快?