使用PowerShell调用打开文件对话框

6
当我运行以下代码时,PowerShell会挂起等待对话框关闭,即使对话框从未显示:
[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )
$d = New-Object Windows.Forms.OpenFileDialog
$d.ShowDialog( )

Windows.Forms.Form上调用ShowDialog函数是有效的。我还尝试创建一个Form并将其作为父窗口传递给$d.ShowDialog,但结果并没有什么不同。


如果有人感兴趣,这是我用它做的事情:http://stackoverflow.com/questions/182573/powershell-cli-or-gui-which-do-you-need-or-prefer#216936 - Emperor XLII
3个回答

16

我能够重现你的问题并找到了一种解决方法。我不知道为什么会出现这种情况,但是其他人也遇到了同样的问题。

如果将ShowHelp属性设置为$true,则对话框会正确弹出。

示例:

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )
$d = New-Object Windows.Forms.OpenFileDialog
$d.ShowHelp = $true
$d.ShowDialog( )

祝你好运!


有趣的变通方法!很想知道设置ShowHelp如何“修正”问题,但我很高兴它起作用 :) - Emperor XLII
奇怪,这个解决方法对我不起作用。无论是否使用它,对话框总是在 PowerShell 窗口后面打开。 - Charlie
看起来差异可能是由于PowerShell版本或操作系统版本引起的(请参见Steven在我的回复中的评论) - Charlie
对我来说,对话框从未显示过;不仅仅是隐藏在窗口后面。添加.ShowHelp = $true 对我有用,并且我正在使用它在我的PowerShell函数中通过GUI从用户获取不同类型的输入(http://blog.danskingdom.com/powershell-multi-line-input-box-dialog-open-file-dialog-folder-browser-dialog-input-box-and-message-box/)。谢谢。 - deadlydog

2

在我看来,对话框实际上是正常打开的,但是它被 PowerShell 控制台窗口遮挡了。不幸的是,它不会显示在任务栏中,所以除非您移动 PowerShell 窗口或使用 Alt+Tab,否则没有任何指示它存在。似乎 ShowHelp 解决方法对我没有任何影响。

编辑 这里有一种使用您的辅助窗体思路来解决问题的方法。基本思路是创建一个新窗体,在其 Shown 事件中打开 OpenFileDialog。关键是在打开对话框之前调用 Activate 方法,以便该窗体处于前景并出现对话框。我通过将 Location 设置为屏幕外的值来将窗体移出屏幕,但您也可以在 Shown 事件中将 Form.Visible = $false。

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )

$ofn = New-Object System.Windows.Forms.OpenFileDialog

$outer = New-Object System.Windows.Forms.Form
$outer.StartPosition = [Windows.Forms.FormStartPosition] "Manual"
$outer.Location = New-Object System.Drawing.Point -100, -100
$outer.Size = New-Object System.Drawing.Size 10, 10
$outer.add_Shown( { 
   $outer.Activate();
   $ofn.ShowDialog( $outer );
   $outer.Close();
 } )
$outer.ShowDialog()

1
我仔细检查了一遍,对话框似乎根本没有出现,即使移动或最小化PowerShell窗口也是如此。你的配置可能有所不同? - Emperor XLII
尝试了你编辑过的代码;表单出现了,但文件对话框只有在我将$ofn.ShowHelp设置为true后才起作用。 - Emperor XLII
我想知道操作系统是否与此有关。我正在使用XP专业版 - 你们两个呢? - Charlie
@Charlie 我之前在Vista(和CTP2)上尝试过,现在我在XP上用V1试了一下。在XP上,我得到了和你一样的结果Charlie,但是在Vista上,我得到了“正确”的行为。 - Steven Murawski
2
我建议使用这行代码替代:$outer.DialogResult = $ofn.ShowDialog( $outer );。否则,对话框总是返回“取消”。 - Hamish Grubijan

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接