1

只是想知道我是否可以像 $PID 或进程 ID 一样获得线程 ID 的 $TID,在 powershell 7 或 pwsh 中使用 foreach-object -parallel(https://github.com/PowerShell/PowerShell#-powershell) . 我可以运行它并在 pwsh.exe 属性的线程选项卡中查看sysinternals procexp ( https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer )中带有 TID 列的一堆线程.

 1..20 | foreach-object -Parallel { start-sleep (5*$_) } -ThrottleLimit 20

在此处输入图像描述

4

1 回答 1

1

进程ID ( $PID) 不同,没有 反映线程ID 的自动 PowerShell 变量(从 PowerShell 7.2 开始)。

如果获取托管(相对于本机)线程 ID 就足够了,您可以使用 .NET API ( System.Threading.Thread.CurrentThread):

1..2 | % -Parallel { [System.Threading.Thread]::CurrentThread.ManagedThreadId }

要获取本线程 ID,您需要通过 P/Invoke提供特定于平台的解决方案;例如,对于Windows,使用GetCurrentThreadId()WinAPI 函数:

# For Windows
Add-Type -Name WinApi -Namespace demo -MemberDefinition @'
  [DllImport("Kernel32.dll")]
  public static extern uint GetCurrentThreadId();
'@

1..2 | % -Parallel { [demo.WinApi]::GetCurrentThreadId() }
于 2021-08-21T16:41:15.887 回答