我试图在我的应用程序中添加一些相当有限的PowerShell支持:我希望能够定期运行用户定义的PowerShell脚本并显示任何输出,并且(最终)能够处理进度通知和用户提示请求.我并不需要命令行式的交互式支持,或(我认为),远程访问或同时运行多个脚本的能力,除非用户脚本做本身从shell我主内.我最终想要异步或在后台线程上运行脚本,并可能与种子一些初始变量和外壳,也许一个小命令但那是因为"看中",因为这功能是可能得到的.
我一直在阅读关于编写主机应用程序代码的MSDN文档,但是它很乐意解释如何创建一个PowerShell
对象,或者Runspace
,或者RunspacePool
,或者Pipeline
,没有任何迹象表明为什么会选择这些方法而不是另一种方法.
我想我已经归结为这两个中的一个,但是我想要一些关于哪种方法更好的反馈意见:
PowerShell shell = PowerShell.Create();
shell.AddCommand(/* set initial state here? */);
shell.AddStatement();
shell.AddScript(myScript);
shell.Invoke(/* can set host! */);
Run Code Online (Sandbox Code Playgroud)
要么:
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! */);
Run Code Online (Sandbox Code Playgroud)
(其中一个必需的PSHost
类方法是EnterNestedPrompt()
,我不知道我运行的用户定义的脚本是否会导致它被调用.如果可以,那么我将负责"开始一个新的嵌套输入循环"(按照此处)...如果这会影响上面的路径,那么这也是很好的.)
谢谢!
我正在编写一个执行powershell脚本的Web服务(活动目录,目录管理等).
现在,每个Web请求都会创建Runspace实例.由于Runspace初始化是一项耗时的操作,因此通常我必须导入像ActiveDirectory这样的模块,这些模块的运行速度也很慢.
在此博客文章" 使用C#管理Exchange 2007收件人"中,Runspace实例保留在静态字段中.
如果我将Runspace实例保存在静态字段中,我会徘徊,它是否是线程安全的?这样做可能有其他缺点吗?
谢谢
Write-Host
在可以针对任何合理主机实现运行的脚本中,是否有任何理智、可靠的契约指示在给定的 PowerShell 主机实现中是否受支持?
(假设我理解Write-Host
和Write-Output
/之间的区别,并且Write-Verbose
我确实需要Write-Host
语义,如果支持的话,对于这个特定的人类可读文本。)
我想尝试询问$Host
变量,或$Host.UI
/$Host.UI.RawUI
但我发现的唯一相关差异是:
在$Host.Name
:
$Host.Name = 'ConsoleHost'
$Host.Name = 'Windows PowerShell ISE Host'
$Host.Name = 'Default Host'
在$Host.UI.RawUI
:
$Host.UI.RawUI
$null
对于 的某些属性,ISE 不返回任何值(或)$Host.UI.RawUI
,例如$Host.UI.RawUI.CursorSize
$Host.UI.RawUI
维护一个$Host.Name
支持的值列表Write-Host
似乎有点负担,尤其是现在 PowerShell 是跨平台的。我合理地希望脚本能够从任何主机调用,并且只做正确的事情。
我编写了一个脚本,可以从 PowerShell 命令提示符、ISE 或 SQL …