如何获取Powershell脚本的PID



我想获取powershell脚本的PID。我可以在这样的狂欢中做到这一点:

#!/bin/bash
VARIABLE=$$
echo "This is a test"
echo $VARIABLE

输出为:

root@DESKTOP-TURGKNS:~# ./test.sh
THIS IS A VARIABLE
218

如果我再次执行脚本,PID每次都会改变。

在powershell中,如果我尝试:

$PID
Write-Output "THIS IS A TEST"

输出为:

PS C:Windowssystem32> $PID
Write-Output "THIS IS A TEST"
5520
THIS IS A TEST
PS C:Windowssystem32> $PID
Write-Output "THIS IS A TEST"
5520
THIS IS A TEST
PS C:Windowssystem32> $PID
Write-Output "THIS IS A TEST"
5520
THIS IS A TEST

我认为$$和$PID的工作方式不同。

有人教我怎么做吗?

与为兼容POSIX的shell(如bash(编写的shell脚本不同,PowerShell脚本(*.ps1文件(在进程内运行

因此,给定PowerShell会话(进程(中给定脚本的所有调用(更常见的是,所有脚本(都会在自动$PID变量中报告相同的值,即当前进程的ID。

若要运行进程的.ps1 scriptout,您必须调用PowerShellCLI(powershell.exe用于Windows PowerShell,pwsh用于PowerShell(Core(7+(,它将创建PowerShell子进程;例如:

# Note: Passing a command via { ... } only works from *inside* PowerShell.
pwsh -NoProfile { ./some.ps1 }
# With arguments
pwsh -NoProfile { ./some.ps1 @args } -args foo, $PID

但是:

  • PowerShell的启动成本非常高,因此您要付出显著的性能代价。

  • 在幕后,基于XML的序列化和反序列化涉及到数据类型的通信,并且类型保真度有限制,就像在PowerShell远程处理中一样。也就是说,如果将复杂对象传递给子进程或从子进程接收到复杂对象,则只能获得这些对象的模拟-有关背景信息,请参阅此答案。

请注意,如果从PowerShell外部的进行调用,请使用CLI的-File参数来调用脚本(在这种情况下,仅支持textin-and output(;例如:

pwsh -NoProfile -File ./some.ps1 foo $PID

有关PowerShell CLI的全面描述,请参阅以下答案。


我认为$$[在bash]中]和$PID[在PowerShell中]的工作方式不同。

它们都报告当前进程的ID;观察到的行为的差异仅仅是由于子进程中的执行与进程内执行之间的差异。

顺便说一句:PowerShell也有一个自动CCD_ 9变量,但它的用途与bash(相当于PowerShell的$PID(完全不同:它包含最近提交的命令行的最后一个令牌,旨在方便交互式编辑(例如,在提交Get-ChildItem someReallyLongDirectoryName后,您可以在下一个提示下用$$引用someReallyLongDirectoryName(。

因此,它相当于bash的内置$_变量。

最新更新