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

时间:2016-03-25 17:19:30

标签: powershell runspace

对不起工资。我会再试一次:

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

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

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

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

感谢。

4 个答案:

答案 0 :(得分:3)

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

# 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()
# 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()

或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()
# 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()

答案 1 :(得分:0)

简单的解决方案是使第二个脚本成为一个函数,然后点源它并将返回值捕获到一个变量中。

我不完全确定这是否可行,否则你可以尝试$global:variableName或者可能将某些事情作为工作。如果这些都不起作用,您可以使第二个脚本将结果存储在文件中,然后从第一个脚本访问该文件。

答案 2 :(得分:0)

虽然你的问题不是很明确,但我会尝试回答。

在您的第二个脚本正在执行某事时,您似乎希望继续处理第一个脚本。

您可以在Job中放置一个特定的操作(有点像一个线程)并稍后通过while ($true)循环接收它,指定满足您需求的条件,然后在收到该Job的结果后退出循环或者线程。

请查看Get-Help | Start-Job了解更多相关信息,或尝试点击谷歌。

您还可以通过执行import-module '.\pathtoscriptmodule.psm1'或仅.\Pathtoscriptdefiningfunctions.ps1从外部脚本文件导入要使用的函数,从其他脚本导入用户定义的函数。

使用“开始作业”的示例..

$scriptblock = {
param($myParam); 
    # My commands here
}

Start-Job -ScriptBlock $scriptblock -args $myParamsIWantToPassToScriptblock

While ($true){
    # To view status of that background job
    Get-Job *
    # Add your logic for fulfilling your conditons here, then
    # break; <<uncomment to break out of loop
    if (conditions met)
    {
        break;
    }
}

# Gets the output from that job. -Keep keeps the output in memory
# if you want to call it multiple times
Receive-Job * -Keep

答案 3 :(得分:0)