【问题标题】:How do I properly use the FolderBrowserDialog in Powershell如何在 Powershell 中正确使用 FolderBrowserDialog
【发布时间】:2014-09-05 16:12:13
【问题描述】:

所以我对 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
    }
}

也许我在这方面做得很差,但它会拉出窗口来选择一个文件或文件夹,让我选择两次,然后不将变量设置为文件路径。再说一次,我对这种事情还很陌生,所以我可能完全错了,但任何帮助都会非常有帮助。

谢谢!

【问题讨论】:

    标签: powershell-3.0


    【解决方案1】:

    文件夹选择器窗口显示两次,因为您有两次调用 $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"
        $foldername.SelectedPath = $initialDirectory
    
        if($foldername.ShowDialog() -eq "OK")
        {
            $folder += $foldername.SelectedPath
        }
        return $folder
    }
    
    $a = Get-Folder
    

    这样您将在$a 变量中拥有您选择的文件夹。

    【讨论】:

      【解决方案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】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          干杯,加斯

          【讨论】:

            【解决方案5】:

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

            Write-Host -ForegroundColor Red -BackgroundColor Yellow  "`n`n`t* * * `t`tW A R N I N G :   Dialog box may be hidden behind another [or this] window!!!`t`t* * *" 
            

            【讨论】:

            • 在测试脚本时,我发现了两个问题: 1. 它总是在我正在使用的 PowerShell 窗口后面打开(因此出现了上面的警告)。 2. 如果我使用 $FolderBrowserDialog.RootFolder = 'MyComputer' 行,并将'$initialDirectory' 发送到函数,如果所需文件夹不在我的电脑顶部附近,则它不在屏幕上。我最初的反应是它没有选择任何东西。直到我的大脑终于赶上并说,“向下滚动。” (12 小时轮班;我累了 )注释掉“.RootFolder”并没有什么不同。
            • 所以你的答案是你自己的问题/问题的解决方案——在你自己答案的评论中定义——而不是直接回答原始帖子中的问题?我认为这作为一个独立的帖子会更好地参考这个问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-14
            • 1970-01-01
            • 2021-02-13
            • 2021-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多