【问题标题】:Pipelining between two SEPARATE Powershell processes两个单独的 Powershell 进程之间的流水线
【发布时间】:2015-11-10 11:27:58
【问题描述】:

假设我有两个 PowerShell 程序正在运行:Producer.ps1Consumer.ps1

有没有办法在我拥有的两个.ps1 文件之间建立客户端-服务器关系?

具体来说,Producer.ps1 输出一个包含登录信息的PSObject。有什么方法可以在两个对象之间建立一个侦听器和命名管道,将PSObjectProducer.ps1 直接传递到Consumer.ps1


(注意:这两个文件不能合并,因为它们都需要以不同的 Windows 用户身份运行。我知道一种可能的通信解决方案是将 PSObject 写入 text/xml文件,然后让客户端读取并擦除文件,但我不想这样做,因为它会暴露凭据。我愿意接受您的任何建议)

【问题讨论】:

    标签: powershell pipelining


    【解决方案1】:

    我发现这个链接描述了如何做你所要求的: https://gbegerow.wordpress.com/2012/04/09/interprocess-communication-in-powershell/

    我对其进行了测试,并且能够在两个单独的 Powershell 会话之间传递数据。

    服务器端:

    $pipe=new-object System.IO.Pipes.NamedPipeServerStream("\\.\pipe\Wulf");
    'Created server side of "\\.\pipe\Wulf"'
    $pipe.WaitForConnection(); 
    
    $sr = new-object System.IO.StreamReader($pipe); 
    while (($cmd= $sr.ReadLine()) -ne 'exit') 
    {
     $cmd
    }; 
    
    $sr.Dispose();
    $pipe.Dispose();
    

    客户端:

    $pipe = new-object System.IO.Pipes.NamedPipeClientStream("\\.\pipe\Wulf");
     $pipe.Connect(); 
    
    $sw = new-object System.IO.StreamWriter($pipe);
    $sw.WriteLine("Go"); 
    $sw.WriteLine("start abc 123"); 
    $sw.WriteLine('exit'); 
    
    $sw.Dispose(); 
    $pipe.Dispose();
    

    【讨论】:

    • 这是一个很棒的发现,正是我想要做的。非常感谢!
    • 对未来读者的澄清:服务器端是监听器,客户端是生产者。在这种情况下,客户端通过管道将消息发送到服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多