我很难将PowerShell脚本中的数据传输到C#程序中。
Thanks to this answer I was given,我已经提出了一个工作解决方案,用于在两个PowerShell脚本(Sender.ps1
和Receiver.ps1
)之间管理数据。
问题是,这个脚本在翻译成C#代码时不起作用。
即使我通过Receiver.ps1
课程在C#中调用PowerShell
,它仍然无效。
This answer to a similar question让我相信管道的命名空间不一样,但当我尝试将Global
添加到每个管道的开头时,它没有做任何事情。同样,如果我作为PowerShell脚本运行,它可以在两个.ps1
中运行,但是如果我从C#调用其中一个脚本,或者直接将它转换为C#,它将完全停止工作。
有没有人知道Windows中的命名空间和流水线技术?
Sender.ps1 :除了通过管道发送数据外,不与C#程序交互
## Establish Pipe
$pipe = New-Object System.IO.Pipes.NamedPipeClientStream("Global\\.pipe\brokenPipe");
$pipe.Connect();
$stream = New-Object System.IO.StreamWriter($pipe);
## Communicate through Pipe
SendStuff();
## Close Pipe
$stream.Dispose();
$pipe.Dispose();
Receiver.ps1:用于从管道读取的PowerShell程序。 工作如果我右键单击并以PowerShell身份运行。 无效如果我通过C#的PowerShell调用它,它只会挂在WaitForConnection()
。 C#程序正在正确地调用脚本,我用一个充满信息的虚拟文件(正确读取了C#)对此进行了测试。出于某种原因,管道在通过我的C#应用程序
## Establish Pipe
$pipe = new-object System.IO.Pipes.NamedPipeServerStream("Global\\.pipe\brokenPipe");
$pipe.WaitForConnection();
$stream = new-object System.IO.StreamReader($pipe);
## Communicate through Pipe
ReadStuff();
## Close Pipe
$stream.Dispose();
$pipe.Dispose();
C#接收器功能:我将其作为PowerShell.Create()
的替代品,但这也不起作用(即使它与{的代码完全相同) {1}}。
Receiver.ps1
答案 0 :(得分:2)
全局命名空间前缀为Global\
,而不是Global\\
。你不需要在Powershell中逃避反斜杠。
Global\pipename
@"Global\pipename"
或"Global\\pipename"