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

本文关键字:GetFileDropList 为空 脚本 PowerShell 控制台 应用程序 调用 当从 | 更新日期: 2023-09-27 17:52:13

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

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中运行它时,它可以工作。

有什么建议吗?

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

要访问剪贴板,您需要确保您的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);
    }
}

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

add-type -an system.windows.forms