gpt4 book ai didi

powershell - 托管PowerShell:PowerShell与Runspace与RunspacePool与管道

转载 作者:行者123 更新时间:2023-12-03 14:25:12 26 4
gpt4 key购买 nike

我试图在我的应用程序中添加一些相当有限的PowerShell支持:我希望能够定期运行用户定义的PowerShell脚本并显示任何输出,并且(最终)能够处理进度通知和用户提示请求。我不需要命令行式的交互式支持,也不需要远程访问或运行多个同时运行的脚本的功能,除非用户脚本本身是在我托管的 shell 中执行的。我最终将要异步地或在后台线程上运行脚本,并可能用一些初始变量和cmdlet来为shell播种,但这很可能会获得“幻想”。

我一直在阅读MSDN documentation about writing host application code,但是虽然它愉快地说明了如何创建PowerShell对象,RunspaceRunspacePoolPipeline,但是没有迹象表明为什么有人会选择这些方法中的任何一种来代替另一种方法。

我认为我只能采用这两种方法中的一种,但是我希望获得一些反馈,以了解哪种方法更合适:

PowerShell shell = PowerShell.Create();
shell.AddCommand(/* set initial state here? */);
shell.AddStatement();
shell.AddScript(myScript);
shell.Invoke(/* can set host! */);

要么:
Runspace runspace = RunspaceFactory.CreateRunspace(/* can set host and initial state! */);
PowerShell shell = PowerShell.Create();
shell.Runspace = runspace;
shell.AddScript(myScript);
shell.Invoke(/* can set host here, too! */);

( PSHost是必需的 EnterNestedPrompt()派生的类方法之一,我不知道我运行的用户定义脚本是否可能导致调用该脚本。如果可以,那么我将负责“启动一个新的嵌套输入循环”( as per here)...如果这影响到上方的路径,那么也很高兴知道。)

谢谢!

最佳答案

这些是什么?

  • 管道

  • 管道是在Powershell脚本中串联命令的一种方式。示例:您使用 Get-ChildeItem将输出从 Where-Object“管道”到 |进行过滤:
    Get-ChildItem | Where-Object {$_}
  • PowerShell对象

  • PowerShell对象引用一个powershell session ,就像启动powershell.exe时将得到的那样。
  • 运行空间

  • 每个Powershell session 都有其自己的运行空间(您将始终从 Get-Runspace获取输出)。它定义了powershell session 的状态。因此,运行空间的 InitialSessionState对象/属性。您可能决定在Powershell中使用其自己的运行空间创建一个新的Powershell session ,以启用一种多线程。
  • RunspacePool

  • 最后但并非最不重要的RunspacePool。顾名思义,它是一个运行空间(或Powershell session )池,可用于处理许多复杂的任务。一旦池中的一个运行空间完成了它的任务,它可能会执行下一个任务,直到一切完成。 (与10个运行空间有关的100件事:平均而言,它们每个处理10个,但一个可能处理8个,而另外两个可能处理11个...)

    什么时候使用什么?
  • 管道

  • 管道用于脚本。它使构建复杂脚本变得更加容易,应尽可能频繁地使用它。
  • PowerShell对象

  • 当您需要新的powershell session 时,将使用powershell对象。您可以在现有脚本(C#或Powershell)中创建一个。它对于轻松实现多线程很有用。它会自行创建一个默认 session 。
  • 运行空间

  • 如果要创建Powershell的非标准 session ,则可以在使用Runspace对象创建Powershell session 之前对其进行操作。当您要在额外的运行空间中共享同步的变量,函数或类时,这很有用。多线程稍微复杂一点。
  • RunspacePool

  • 如前所述,它是繁重工作的繁重工具。当一次执行脚本要花费几个小时,而您需要经常执行一次。与远程处理结合使用,您可以同时在大型集群等的每个节点上安装某些东西。

    关于powershell - 托管PowerShell:PowerShell与Runspace与RunspacePool与管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329448/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com