从C#创建PowerShell自动变量

3 c# powershell excel-addins

我试图使自动变量可用于Excel VBA(如ActiveSheet或ActiveCell),PowerShell也可以将其作为"自动变量"使用.PowerShell引擎托管在Excel VSTO加载项中,Excel.Application可作为Globals.ThisAddin.Application使用.我在StackOverflow上找到了这个线程,并开始创建PSVariable派生类,如:

public class ActiveCell : PSVariable
{
    public ActiveCell(string name) : base(name) { }

    public override object Value
    {
        get 
        { 
            return Globals.ThisAddIn.Application.ActiveCell; 
        }
    }
}

public class ActiveSheet : PSVariable
{
    public ActiveSheet(string name) : base(name) { }

    public override object Value
    {
        get 
        { 
            return Globals.ThisAddIn.Application.ActiveSheet; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并将他们的实例添加到当前的POwerShell会话:

runspace.SessionStateProxy.PSVariable.Set(new ActiveCell("ActiveCell"));
runspace.SessionStateProxy.PSVariable.Set(new ActiveSheet("ActiveSheet"));
Run Code Online (Sandbox Code Playgroud)

这有效,我可以使用PowerShell中的那些变量作为$ ActiveCell和$ ActiveSheet(它们的值更改为Excel活动工作表或单元格更改).然后我在这里阅读PSVariable文档并看到了这个:

"没有确定的方案可以从这个类派生.要以编程方式创建一个shell变量,创建一个这个类的实例并使用PSVariableIntrinsics类来设置它."

由于我是从PSVariable派生出来的,我试图使用建议的内容:

PSVariable activeCell = new PSVariable("ActiveCell");
activeCell.Value = Globals.ThisAddIn.Application.ActiveCell;
runspace.SessionStateProxy.PSVariable.Set(activeCell);
Run Code Online (Sandbox Code Playgroud)

使用它,$ ActiveCell出现在我的PowerShell会话中,但是当我在Excel中更改活动单元格时,它的值不会改变.

PSVariable文档中的上述注释是我应该担心的,或者我可以继续创建PSVariable派生类吗?有没有其他方法可以让PowerShell使用Excel全局变量?

小智 5

我们的文档是错误的 - 它是受支持的方案.

以下是关于该技术的更多信息:

  1. http://poshcode.org/2198
  2. http://www.leeholmes.com/blog/2009/03/26/more-tied-variables-in-powershell/
  3. http://www.pavleck.net/powershell-cookbook/ch03.html

Lee Holmes [MSFT] Windows PowerShell开发