当从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中运行它时,它可以工作。
有什么建议吗?
要访问剪贴板,您需要确保您的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