【问题标题】:invoke a private environment variable of a process from another PS Session从另一个 PS Session 调用进程的私有环境变量
【发布时间】:2021-11-04 02:02:24
【问题描述】:

我的数据库上正在运行一个进程 (testxx)。每次用户连接数据库时,该进程都会启动单独的会话。所有进程都包含一个具有不同值的私有环境变量(Client-Nr)。我想用特定的私有环境变量调用特定的进程。我使用了以下命令:

假设有 5 个“testxx”进程。我想调用私有环境变量“Client-Nr”中值为“Client-Two”的一个进程。

因此,我使用以下代码:

get-process -name "testxx" | where-object {$env:Client-Nr -eq "client-Two"}

它没有调用我需要的过程。如果 PowerShell 识别出私有环境变量,我使用以下命令进行了检查:

(get-process -Name "testxx").StartInfo.EnvironmentVariables

PowerShell 无法识别此私有环境变量。但是,如果我打开“Process Hacker”,选择特定的“testxx”进程,我会看到具有特定“Client-nr”值的私有环境变量“client-Nr”。如何通过 PowerShell 调用这种私有环境变量?

【问题讨论】:

  • 我被屏蔽了,只是因为提到的帖子对我没有帮助还是什么?
  • @keeran 您的问题并不完全清楚。您是否试图找到在其环境块中设置了 FirstName 环境变量的进程?
  • 很抱歉给您带来不便。我不知道,我在处理什么。请不要仅仅因为问题不清楚就阻止该帐户。如果我不明白我在处理什么,我无法很好地解释它。我再次编辑了我的帖子。希望你们现在明白我的问题了。
  • @Olaf 谢谢你的时间。我想,我的问题是不同的。带来不便敬请谅解。能不能再看看我的帖子。我已经编辑过了。
  • @keeran 您可以在机器或用户上下文中使用环境变量。但是这两种方式都需要在创建或设置环境变量后启动要使用这些变量的 PowerShell 会话。另一种方法是使用一种设置文件或注册表值。两者都不需要在第一个 PowerShell 会话之后启动 PowerShell 会话。 ;-)

标签: powershell process window-handles


【解决方案1】:

我认为这将是一个很长的评论,但实际上它是一个。 ;-)

我仍然不确定我是否得到了你想要的。但是,如果这是我认为的那样,您可能会走错路。我认为 PowerShell (Windows) 没有私有环境变量的概念,只属于一个正在运行的进程。我认为您可以从System.Diagnostics.Process 类型的对象中使用.StartInfo.EnvironmentVariables 获得的环境变量是进程启动时继承的环境变量。所以它们不会随着进程运行的时间而改变。

您需要一个属性 what's - 从流程内部操作 - 对流程外部可见。对于手动启动的控制台,这可能是MainWindowTitle

你可以测试一下。我创建了一个文件GUID-Title_90Sec.ps1,内容如下:

$Host.UI.RawUI.WindowTitle = $(New-Guid)
Start-Sleep -Seconds 90

现在我运行了几次

Start-Process Powershell -ArgumentList '-NoProfile', '-File .\GUID-Title_90Sec.ps1' 

还有……

Get-Process -Name PowerShell | 
    Select-Object -Property Name,MainWindowTitle

...您可以列出所有这些进程,如下所示:

Name       MainWindowTitle
----       ---------------
powershell ParentProcess
powershell ff37b8b6-f791-4d2b-8dfd-8c0dc0a8bc96
powershell fe06d061-784f-441b-8cd4-0a2d3ec040c5
powershell 9f954fb5-cda8-4f2a-98fe-391c59c51ab2
powershell 095a8019-08d5-4461-ab3c-d6f0f2f485cb
powershell

我只是怀疑这是否适用于由数据库引擎启动的进程,因为它们可能没有MainWindowTitle。对不起。 ;-)

编辑:

您可以跟踪您启动的流程,而不是尝试识别之后的流程。 当您在变量中启动它的那一刻保存流程信息时,您可以稍后使用它。与...

$PowerShellInstance = Start-Process Powershell -PassThru

您开始一个新的 PowerShell 会话。与...

$PowerShellInstance

...你有关于这个过程的所有信息。比如……

$PowerShellInstance.Id 

... 显示进程 ID。这会有帮助吗? ;-)

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多