从C#控制台应用程序调用PowerShell脚本时,GetFileDropList为空

时间:2015-06-01 14:07:41

标签: c# powershell

由于某些原因,此脚本在此代码中不起作用:

public class PowerShellTest
{
    public void Execute()
    {
        string scriptText = "$F = [System.Windows.Forms.Clipboard]::GetFileDropList(); $F;";
        //string co = "\"D:\\\"";
        //co = "$Dirs = [System.IO.Directory]::GetDirectories(" + co + "); ";
        //co = co + " $Dirs;";
        //scriptText = co;
        using( PowerShell ps = PowerShell.Create() )
        {
            ps.AddScript(scriptText, true);
            var x = ps.Invoke();
        }
    }
}

问题是它没有返回任何内容,PSObject集合计数为0

但是,当我在PowerShell ISE中运行它时,它会起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

PowerShell ISE会自动加载Windows窗体类型,但PowerShell命令行则不会。在尝试对剪贴板对象执行任何操作之前,请在脚本中使用以下行。

add-type -an system.windows.forms

答案 1 :(得分:1)

要访问剪贴板,您需要确保PowerShell实例以STA或单线程单元模式启动,并确保您已引用System.Windows.Forms程序集。

要做到这一点:

string scriptText = @"
  Add-Type -an System.Windows.Forms | Out-Null;
  $f = [System.Windows.Forms.Clipboard]::GetFileDropList(); 
  $f;
";

using (PowerShell ps = PowerShell.Create())
{
    PSInvocationSettings psiSettings = new PSInvocationSettings();
    psiSettings.ApartmentState = System.Threading.ApartmentState.STA;

    ps.AddScript(scriptText, true);
    var x = ps.Invoke(null, psiSettings);
}

如果您尝试直接从.NET控制台应用程序执行此操作,则需要执行相同的操作:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        var f = System.Windows.Forms.Clipboard.GetFileDropList();
        Console.WriteLine(f.Count);
    }
}