2

我试图创建一个窗口窗体,单击时有一个按钮将显示一个文件夹/文件浏览窗口,然后用户选择文件/文件夹并单击确定,然后我可以将所选路径用作另一个脚本的字符串。

问题是,当我通过 PowerGUI(powershell 脚本应用程序)运行它时,它工作正常,但是当我通过 windows powershell 运行它时,它在加载浏览对话框时挂起,任何人都见过这个,或者看到我做错了什么或得到了替代方案,任何帮助将不胜感激。

cls
$button = $browse = $form = 0
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$browse = new-object system.windows.Forms.FolderBrowserDialog
$browse.RootFolder = [System.Environment+SpecialFolder]'MyComputer'
$browse.ShowNewFolderButton = $false
$browse.selectedPath = "C:\"
$browse.Description = "Choose a directory"

$button1 = New-Object system.Windows.Forms.Button
$button1.Text = "Choose Directory"
$button1.Add_Click({$browse.ShowDialog()})
$button1.left = 20
$button1.top = 20

$form = New-Object system.windows.forms.Form
$form.controls.add($button1)
$form.ShowDialog()
$form.Dispose()

$browse.SelectedPath
4

4 回答 4

1

当我尝试时,您的代码有效。但是我注意到有时(尤其是会话中的第二次)我使用浏览窗口,它隐藏在 PowerShell 控制台后面,看起来好像卡住了。那么,当它“挂起”时,你可以尝试将你的 powershell 控制台移到一边吗?

另外,作为一个建议:如果您只使用表单来选择文件夹位置,我会跳过它。无论如何,在您关闭表单之前,您都不会收到浏览器值,因此请尝试以下操作:

function Get-BrowseLocation
{
    [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    [System.Windows.Forms.Application]::EnableVisualStyles()
    $browse = New-Object System.Windows.Forms.FolderBrowserDialog
    $browse.RootFolder = [System.Environment+SpecialFolder]'MyComputer'
    $browse.ShowNewFolderButton = $false
    $browse.Description = "Choose a directory"

    $loop = $true
    while($loop)
    {
        if ($browse.ShowDialog() -eq "OK")
        {
            $loop = $false
        } else
        {
            $res = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Try again or exit script?", "Choose a directory", [System.Windows.Forms.MessageBoxButtons]::RetryCancel)
            if($res -eq "Cancel")
            {
                #End script
                return
            }
        }
    }
    $browse.SelectedPath
    $browse.Dispose()
}

PS > Get-BrowseLocation
D:\
于 2013-01-27T19:10:58.483 回答
1

通过 PowerShellPlus(另一个 powershell 编辑器)运行我的脚本时,我遇到了类似的问题。幸运的是,我发现这篇文章展示了如何在不使用 FolderBrowserDialog 的情况下提示输入文件夹。这是我在编写的一组 powershell 函数中使用的代码,用于通过 GUI 提示用户进行多种不同类型的输入。

# Show an Open Folder Dialog and return the directory selected by the user.
function Read-FolderBrowserDialog([string]$Message, [string]$InitialDirectory)
{
    $app = New-Object -ComObject Shell.Application
    $folder = $app.BrowseForFolder(0, $Message, 0, $InitialDirectory)
    if ($folder) { return $folder.Self.Path } else { return '' }
}
于 2013-05-17T20:22:15.717 回答
1

如果您对Frode提供的功能进行以下更改。F,对话框总是会出现在顶部。

$topform = New-Object System.Windows.Forms.Form
$topform.Topmost = $true
$topform.MinimizeBox = $true

$loop = $true
while($loop)
{
    if ($browse.ShowDialog($topform) -eq "OK")
于 2016-05-27T06:11:07.493 回答
0

我认为您遇到了我遇到的问题,该问题已在此问题中解决

答案建议设置.ShowHelp$true,如下所示:

$openFileDialog = New-Object System.Windows.Forms.openFileDialog
$openFileDialog.ShowHelp = $true
$openFileDialog.ShowDialog() | Out-Null
于 2013-01-30T17:38:34.923 回答