如何在Powershell中正确使用FolderBrowserDialog

Ben*_*ble 7 powershell-3.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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Vas*_*eev 15

文件夹选择器窗口显示两次,因为您有两次调用$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
Run Code Online (Sandbox Code Playgroud)

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


小智 14

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

Add-Type -AssemblyName System.Windows.Forms
$browser = New-Object System.Windows.Forms.FolderBrowserDialog
$null = $browser.ShowDialog()
$path = $browser.SelectedPath
Run Code Online (Sandbox Code Playgroud)


Dig*_*igy 7

选择文件夹

使用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)
Run Code Online (Sandbox Code Playgroud)

有关System.Windows.Forms.FolderBrowserDialog课程的更多信息,请查看官方文档

选择文件

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)
Run Code Online (Sandbox Code Playgroud)

有关System.Windows.Forms.OpenFileDialog课程的更多信息,请查看官方文档


小智 5

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

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

干杯,加思