在独立运行的 Powershell 脚本之间传递信息

Rob*_*Rob 0 powershell runspace

很抱歉之前是工资。我会再尝试:

情况太复杂了,无法解释,但基本上问题是:

  • 如何将字符串(最多 20 个字符)从一个脚本传递到在同一台机器上运行的另一个脚本
  • 这两个脚本在后台连续运行,在同一台机器上,在同一个用户上下文下,但不能合并
  • 不能在另一个脚本中点源一个脚本。

我通过让一个脚本在另一个脚本监视的目录中创建一个包含字符串的文件来完成它。所以当它出现时,另一个脚本读取信息。它有效,但感觉“脏”。:)

我想知道是否有一种“最佳实践”——在脚本之间传递信息的方式,或者至少是一种更优雅的方式。

谢谢。

Ans*_*ers 5

有几种方法可以使同一主机上的两个连续运行的进程相互通信,例如命名管道:

# named pipe - server
$name = 'foo'
$namedPipe = New-Object IO.Pipes.NamedPipeServerStream($name, 'Out')
$namedPipe.WaitForConnection()

$script:writer = New-Object IO.StreamWriter($namedPipe)
$writer.AutoFlush = $true
$writer.WriteLine('something')
$writer.Dispose()

$namedPipe.Dispose()
Run Code Online (Sandbox Code Playgroud)
# named pipe - client
$name = 'foo'
$namedPipe = New-Object IO.Pipes.NamedPipeClientStream('.', $name, 'In')
$namedPipe.Connect()

$script:reader = New-Object IO.StreamReader($namedPipe)
$reader.ReadLine()
$reader.Dispose()

$namedPipe.Dispose()
Run Code Online (Sandbox Code Playgroud)

或 TCP 套接字:

# TCP socket - server
$addr = [ipaddress]'127.0.0.1'
$port = 1234

$endpoint = New-Object Net.IPEndPoint ($addr, $port)
$server = New-Object Net.Sockets.TcpListener $endpoint
$server.Start()
$cn = $server.AcceptTcpClient()

$stream = $cn.GetStream()
$writer = New-Object IO.StreamWriter($stream)
$writer.WriteLine('something')
$writer.Dispose()

$server.Stop()
Run Code Online (Sandbox Code Playgroud)
# TCP socket - client
$server = '127.0.0.1'
$port   = 1234

$client = New-Object Net.Sockets.TcpClient
$client.Connect($server, $port)
$stream = $client.GetStream()

$reader = New-Object IO.StreamReader($stream)
$reader.ReadLine()
$reader.Dispose()

$client.Dispose()
Run Code Online (Sandbox Code Playgroud)