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

在独立运行的Powershell脚本之间传递信息,powershell,runspace,Powershell,Runspace,很抱歉在之前被解雇了。我会再试一次: 情况太复杂,无法解释,但基本上问题是: 如何将字符串(最多20个字符)从一个脚本传递到同一台机器上运行的另一个脚本 这两个脚本在同一台机器上,在同一用户上下文下,在后台连续运行, 但是不能合并 I无法将源代码一个脚本点在另一个脚本中 我让一个脚本在另一个脚本监控的目录中创建一个包含字符串的文件。因此,当它出现时,另一个脚本读取信息。 它能工作,但感觉“脏”。) 我想知道是否有一种“最佳实践”——在脚本之间传递信息的方法,或者至少有一种更优雅的方法 谢谢。

很抱歉在之前被解雇了。我会再试一次:

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

  • 如何将字符串(最多20个字符)从一个脚本传递到同一台机器上运行的另一个脚本
  • 这两个脚本在同一台机器上,在同一用户上下文下,在后台连续运行, 但是不能合并
  • I无法将源代码一个脚本点在另一个脚本中
我让一个脚本在另一个脚本监控的目录中创建一个包含字符串的文件。因此,当它出现时,另一个脚本读取信息。 它能工作,但感觉“脏”。)

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


谢谢。

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


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

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


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

你的问题不太清楚,我会尽力回答的

似乎您希望在第二个脚本正在执行(某些操作)时继续处理第一个脚本

您可以将特定操作放入作业(有点像线程)中,稍后通过
while($true)
循环接收该操作,指定满足您需要的条件,然后在收到该作业或线程的结果后中断循环

查看
获取帮助|开始工作
了解更多信息,或者尝试访问谷歌

还可以通过执行
导入模块'.\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
$scriptblock={
参数($myParam);
#我的命令在这里
}
开始作业-ScriptBlock$ScriptBlock-args$myParamsIWantToPassToScriptblock
While($true){
#查看该后台作业的状态
找到工作*
#在这里添加满足条件的逻辑,然后

#打断;你的问题不太清楚,我会尽力回答的

似乎您希望在第二个脚本正在执行(某些操作)时继续处理第一个脚本

您可以将特定操作放入作业(有点像线程)中,稍后通过
while($true)
循环接收该操作,指定满足您需要的条件,然后在收到该作业或线程的结果后中断循环

查看
获取帮助|开始工作
了解更多信息,或者尝试访问谷歌

还可以通过执行
导入模块'.\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
$scriptblock={
参数($myParam);
#我的命令在这里
}
开始作业-ScriptBlock$ScriptBlock-args$myParamsIWantToPassToScriptblock
While($true){
#查看该后台作业的状态
找到工作*
#在这里添加满足条件的逻辑,然后

#break;您可以研究如何使用运行空间


您可以研究如何使用运行空间


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

#命名管道-服务器
$name='foo'
$namedPipe=新对象IO.Pipes.NamedPipeServerStream($name,'Out')
$namedPipe.WaitForConnection()
$script:writer=新对象IO.StreamWriter($namedPipe)
$writer.AutoFlush=$true
$writer.WriteLine('something'))
$writer.Dispose()
$namedPipe.Dispose()
#命名管道-客户端
$name='foo'
$namedPipe=新对象IO.Pipes.NamedPipeClientStream('.',$name,'In'))
$namedPipe.Connect()
$script:reader=新对象IO.StreamReader($namedPipe)
$reader.ReadLine()
$reader.Dispose()
$namedPipe.Dispose()
或TCP套接字:

#TCP套接字-服务器
$addr=[ipaddress]'127.0.0.1'
$port=1234
$endpoint=新对象Net.IPEndPoint($addr,$port)
$server=新对象Net.Sockets.TcpListener$endpoint
$server.Start()
$cn=$server.AcceptCpcClient()
$stream=$cn.GetStream()
$writer=新对象IO.StreamWriter($stream)
$writer.WriteLine('something'))
$writer.Dispose()
$server.Stop()
#TCP套接字-客户端
$server='127.0.0.1'
$port=1234
$client=新对象Net.Sockets.TcpClient
$client.Connect($server,$port)
$stream=$client.GetStream()
$reader=新对象IO.StreamReader($stream)
$reader.ReadLine()
$reader.Dispose()
$client.Dispose()

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

#命名管道-服务器
$name='foo'
$namedPipe=新对象IO.Pipes.NamedPipeServerStream($name,'Out')
$namedPipe.WaitForConnection()
$script:writer=新对象IO.StreamWriter($namedPipe)
$writer.AutoFlush=$true
$writer.WriteL