在 运行 个 Powershell 脚本之间独立传递信息
Pass information between independently running Powershell scrips
抱歉之前打工。我会再试一次:
情况复杂无法解释,但基本上问题是:
- 如何将字符串(最多 20 个字符)从一个脚本传递到同一台机器上的另一个脚本 运行。
- 这两个脚本在同一台机器、同一用户上下文下,在后台连续运行,
但是不能合并.
- 我不能点源一个脚本在另一个脚本中。
我是通过让一个脚本在另一个脚本监视的目录中创建一个包含字符串的文件来完成的。所以当它出现时,另一个脚本读取信息。
能用,但感觉"dirty"。 :)
我想知道是否有一种“最佳实践”-在脚本之间传递信息的方式,或者至少是一种更优雅的方式.
谢谢。
简单的解决方案是使第二个脚本成为一个函数,然后点源它并将 return 值捕获到一个变量中。
我不完全确定这是否可行,否则,您可以尝试 $global:variableName
或可能 运行 的工作。如果 none 有效,您可以让第二个脚本将结果存储在一个文件中,然后从第一个脚本访问该文件。
虽然你的问题不是很清楚,我会尽力回答。
您似乎想在第二个脚本执行(某事)时继续处理第一个脚本。
您可以将特定操作放入作业(有点像线程)中,稍后使用 while ($true)
循环接收它,指定满足您需要的条件,然后在收到结果后跳出循环该作业或线程。
查看 Get-Help | Start-Job
了解更多信息,或尝试访问 google。
您还可以通过执行 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
您可以考虑使用运行空间。
有几种方法可以使同一主机上的两个连续 运行 进程相互通信,例如命名管道:
# 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()
抱歉之前打工。我会再试一次:
情况复杂无法解释,但基本上问题是:
- 如何将字符串(最多 20 个字符)从一个脚本传递到同一台机器上的另一个脚本 运行。
- 这两个脚本在同一台机器、同一用户上下文下,在后台连续运行, 但是不能合并.
- 我不能点源一个脚本在另一个脚本中。
我是通过让一个脚本在另一个脚本监视的目录中创建一个包含字符串的文件来完成的。所以当它出现时,另一个脚本读取信息。 能用,但感觉"dirty"。 :)
我想知道是否有一种“最佳实践”-在脚本之间传递信息的方式,或者至少是一种更优雅的方式.
谢谢。
简单的解决方案是使第二个脚本成为一个函数,然后点源它并将 return 值捕获到一个变量中。
我不完全确定这是否可行,否则,您可以尝试 $global:variableName
或可能 运行 的工作。如果 none 有效,您可以让第二个脚本将结果存储在一个文件中,然后从第一个脚本访问该文件。
虽然你的问题不是很清楚,我会尽力回答。
您似乎想在第二个脚本执行(某事)时继续处理第一个脚本。
您可以将特定操作放入作业(有点像线程)中,稍后使用 while ($true)
循环接收它,指定满足您需要的条件,然后在收到结果后跳出循环该作业或线程。
查看 Get-Help | Start-Job
了解更多信息,或尝试访问 google。
您还可以通过执行 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
您可以考虑使用运行空间。
有几种方法可以使同一主机上的两个连续 运行 进程相互通信,例如命名管道:
# 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()