如何在PowerShell内嵌C#代码中调用Write-Verbose且不新建运行空间
实现方案
你可以直接获取当前会话的运行空间调用Write-Verbose,无需自定义Cmdlet,也不需要创建新的Runspace,核心逻辑是通过PowerShell.Create(RunspaceMode.CurrentRunspace)绑定当前运行空间构造命令调用。
完整可运行示例
$source = @" using System; using System.Management.Automation; using System.Management.Automation.Runspaces; public class MyClass { public void Do() { // 绑定当前运行空间创建PowerShell实例,不会生成新Runspace using (var psInstance = PowerShell.Create(RunspaceMode.CurrentRunspace)) { // 构造Write-Verbose命令调用 psInstance.AddCommand("Write-Verbose") .AddParameter("Message", "来自内联C#代码的Verbose输出"); // 执行调用 psInstance.Invoke(); } } } "@ # 加载类型时指定引用System.Management.Automation程序集 Add-Type -TypeDefinition $source -ReferencedAssemblies "System.Management.Automation" -PassThru | Out-Null $myvar = [MyClass]::new() # 开启Verbose测试输出 $myvar.Do() -Verbose
进阶配置(匹配当前会话的Verbose偏好)
如果不需要强制输出Verbose信息,要和当前PowerShell会话的$VerbosePreference全局配置保持一致,可以在C#代码中读取运行空间的会话变量做判断:
var verbosePreference = (ActionPreference)Runspace.DefaultRunspace.SessionStateProxy.GetVariable("VerbosePreference"); if (verbosePreference is ActionPreference.Continue or ActionPreference.Inquire) { // 执行Write-Verbose逻辑 }
注意事项
- 该方案所有操作都在当前PowerShell会话的运行空间内执行,和原生调用命令的效果完全一致,不会产生额外的运行空间开销
- 如果你的PowerShell版本为7+,引用程序集的参数可以省略,低版本Windows PowerShell需要显式指定
-ReferencedAssemblies参数
内容的提问来源于stack exchange,提问作者D.R.
相关产品推荐
相关产品推荐

