对不起工资。我会再试一次:
情况太复杂,无法解释,但基本上问题是:
我已经通过让一个脚本在另一个脚本监视的目录中创建一个包含字符串的文件来完成它。所以当它出现时,另一个脚本会读取信息。 它有效,但感觉“脏”。 :)
我想知道是否有“最佳做法” - 在脚本之间传递信息的方式,或者至少是更优雅的方式。
感谢。
答案 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)