如何获取Windows中所有打开命名管道的列表?

120

有没有一种简单的方法来测试您的命名管道是否正常工作?我希望确保我从我的应用程序发送的数据实际上已被发送。是否有一种快速简便的方法来获取所有命名管道的列表?

8个回答

135

在Windows Powershell控制台中,输入

[System.IO.Directory]::GetFiles("\\.\\pipe\\")
如果您的操作系统版本高于Windows 7,您也可以输入以下命令:
get-childitem \\.\pipe\
这会返回一个对象列表。如果你只想要名字:
(get-childitem \\.\pipe\).FullName
在PowerShell 7中,第二个示例\\.\pipe\不起作用(请参见此已知的错误),因此您必须坚持使用第一种语法。

4
你可以考虑以管理员身份打开PowerShell。 - dotNetE
2
您还可以使用 get-childitem \.\pipe\ - Chris Gillum
1
@ChrisGillum 但我刚刚在我的Windows Surface RT设备上尝试了一下,它可以工作(Powershell v4)。我会将您的评论纳入答案中。 - Andrew Shepherd
5
在Windows 10 (20H2)上,某种方式下get-childitem变量在Powershell 5上能够运行,但不能在Powershell 7上运行。 - Chih-Hsuan Yen
2
@Chih-HsuanYen - 这是一个bug。以下是解决方法:[System.IO.Directory]::EnumerateFiles('\\.\pipe\') - Granger
显示剩余4条评论

119
您可以使用来自sysinternals的 Process Explorer 来查看这些内容。使用“查找->查找句柄或DLL…”选项,然后输入模式“\Device\NamedPipe\”。它将向您显示哪些进程打开了哪些管道。

在尝试此操作之前,请检查您使用的 Process Explorer 版本。它不适用于 v15.23,但适用于 v16.02。(未尝试其他版本) - Carl
2
为避免可能的异常——如其他答案所述——您可以使用我的解决方案,它更低级但非常好用,即使命名管道的名称包含文件名的无效字符。请参见https://dev59.com/WYLba4cB1Zd3GeqPaSRx#25126943。 - user2126375
4
дҪҝз”ЁSysInternalsдёӯзҡ„pipelist.exeжӣҙдёәз®ҖеҚ•пјҢдҪҶеҸӘиғҪйҖҡиҝҮе‘Ҫд»ӨиЎҢж“ҚдҪңгҖӮ - Chris Charabaruk

57

尝试使用以下内容:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");

7
你缺少一个斜杠。string[] listOfPipes = System.IO.Directory.GetFiles(@"\.\pipe"); - dmex
我花了整晚的时间寻找一个搜索或列出管道的函数。这正是我所需要的。谢谢! - MushroomSoda
这个特殊路径是什么?\.\ 似乎用于对驱动器进行原始访问,但 pipe 又是从哪里来的呢? - Kevin Doyon
2
@Kevin "\." 意味着 "这台机器",参见 https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa365783(v=vs.85).aspx。 - Eugene Ryabtsev
5
我们在Windows 10上使用这种方法时出现了问题,报错“第二个路径片段不能是驱动器或UNC名称。参数名称:path2”。 - Dai Bok
显示剩余2条评论

51

1
另外还可以查看来自Sysinternals的handle.exe,它将显示几乎所有具有打开句柄的内容。 - JimR

35

我偶然发现 Chrome 的一个功能,可以通过导航到 "file://.//pipe//" 来列出所有打开的命名管道。

由于我似乎找不到任何参考资料,而且它对我非常有帮助,所以我想分享一下。


你能再解释一下吗? - Dieter Meemken
1
这确实列出了我的管道。太棒了!(请注意,这将起作用,因为它的工作原理类似于目录,正如Andrew Shepherd的答案所示) - Martín Coll
我猜这是用于调试/诊断,因为我注意到Chrome使用了大量的命名管道 - 即使Chrome没有运行,我也发现了125个“chrome”管道! - Cocowalla
同样适用于Edge。我怀疑它适用于任何浏览器。 - Jay Elston
Daynew,太棒了!非常感谢。@JayElston,在Firefox中不起作用:(只能在Chrome中使用。 - 1234ru

25

CMD提示符下:

>ver

Microsoft Windows [Version 10.0.18362.476]

>dir \\.\pipe\\

1
在W10上可以运行但在W7上无法运行。 - cup
1
添加 /b 可以使输出更易处理。 - ixe013

19

C#:

String[] listOfPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");

10

提交时,此网站会解释第二个管道...您需要在开头使用两个反斜杠。因此,请确保使用System.IO.Directory.GetFiles(@"\\.\pipe\")

请注意,当我的机器上的某个管道具有无效字符时,我曾看到此函数调用引发“路径中存在非法字符”的异常。但 PipleList.exe 运行正常,因此似乎是微软 .NET 代码中的一个错误。


1
关于“路径中的非法字符”的注释是一个重要的点,因为程序经常打开触发此错误的管道名称。任何打开命名为 C:\myLocation\someFile.x 的管道的程序都会导致此错误。 - dss539

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接