我首先要说的是,这是 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/