如何在Powershell中正确使用FolderBrowserDialog

时间:2014-09-05 16:12:13

标签: powershell-v3.0

所以我仍然是Powershell的新手,我正在尝试编写一个脚本,允许用户选择一个文件或文件夹,然后取回所述文件夹/文件的安全权限。问题是,我似乎无法将文件路径记录为稍后要使用的变量。这是我到目前为止所做的:

Function Get-Folder($initialDirectory)
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.rootfolder = "MyComputer"
    $foldername.ShowDialog()

    if($foldername.ShowDialog() -eq "OK") {
        $folder += $foldername.SelectedPath
    }
}

也许我已经离开这个了,但它会拉起窗口选择一个文件或文件夹并让我选择两次,然后不将变量设置为文件路径。再说一次,我对这种事情很陌生,所以我可能完全错了,但任何帮助都会非常有帮助。

谢谢!

5 个答案:

答案 0 :(得分:13)

文件夹选择器窗口显示两次,因为您有两次调用$foldername.ShowDialog()。删除第一个,只留下if内的那个。

我尝试运行您的代码,并确保$folder变量实际上已设置。如果你认为它没有设置你做错了什么。例如,请注意,它仅在Get-Folder函数中可见。如果需要在函数外部使用它,则应将其返回(return $folder)并将其分配给函数外部的变量。例如:

Function Get-Folder($initialDirectory)

{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.Description = "Select a folder"
    $foldername.rootfolder = "MyComputer"

    if($foldername.ShowDialog() -eq "OK")
    {
        $folder += $foldername.SelectedPath
    }
    return $folder
}

$a = Get-Folder

这样,您将在$a变量中包含所选文件夹。

答案 1 :(得分:3)

您需要在行尾添加“| Out-Null” “[System.Reflection.Assembly] :: LoadWithPartialName(” System.Windows.Forms的 “)”

否则有一堆你不想要的Get-Folder返回的信息

干杯,加思

答案 2 :(得分:2)

选择文件夹

使用System.Windows.Forms.FolderBrowserDialog仅允许您选择一个文件夹。

Function Get-Folder($initialDirectory) {
    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    $FolderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog
    $FolderBrowserDialog.RootFolder = 'MyComputer'
    if ($initialDirectory) { $FolderBrowserDialog.SelectedPath = $initialDirectory }
    [void] $FolderBrowserDialog.ShowDialog()
    return $FolderBrowserDialog.SelectedPath
}
($FolderPermissions = Get-Folder C:\Users | get-acl | select -exp access | ft)

有关System.Windows.Forms.FolderBrowserDialog类的更多信息,请检查official docs

选择文件

function Get-File($initialDirectory) {   
    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    if ($initialDirectory) { $OpenFileDialog.initialDirectory = $initialDirectory }
    $OpenFileDialog.filter = 'All files (*.*)|*.*'
    [void] $OpenFileDialog.ShowDialog()
    return $OpenFileDialog.FileName
}
($FilePermissions = Get-File C:\ | get-acl | select -exp access | ft)

有关System.Windows.Forms.OpenFileDialog类的更多信息,请检查official docs

答案 3 :(得分:0)

只需在“ ShowDialog()”行之前的函数中添加以下行:

${set_content(get_or_create('File', 'name', 'img.png', 'contentType', 'image/png'), GET('https://some.host.domain/img.png', 'application/octet-stream'))}

答案 4 :(得分:0)

这是打开对话框窗口的解决方案,要求用户选择文件夹。然后将文件夹路径存储在名为“ path”的变量中:

Add-Type -AssemblyName System.Windows.Forms
$browser = New-Object System.Windows.Forms.FolderBrowserDialog
$null = $browser.ShowDialog()
$path = $browser.SelectedPathode