由于某些原因,此脚本在此代码中不起作用:
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中运行它时,它会起作用。
有什么建议吗?
答案 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);
}
}