You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:45:00