【问题标题】:Using FolderBrowserDialog in Powershell - returns wrong data在 Powershell 中使用 FolderBrowserDialog - 返回错误数据
【发布时间】:2016-08-05 17:47:04
【问题描述】:

看过帖子《如何在Powershell中正确使用FolderBrowserDialog》

我在获取选择从函数返回的路径时遇到问题。

在脚本的结尾,我“写主机 $a”,但我得到的不是只获取我选择的目录 (C:\Temp) System.Windows.Forms,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089 C:\Temp

函数获取文件夹($initialDirectory)

{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")

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

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

}

$a = 获取文件夹 写主机 $a

有人告诉我这是过时的,要使用 Add-Type。不只是使用以下脚本获取路径。

   Add-Type -AssemblyName System.Windows.Forms
   $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
   [void]$FolderBrowser.ShowDialog()
   $FolderBrowser.SelectedPath
   Write-Host "FolderBrowser= "$FolderBrowser

【问题讨论】:

  • 您可能在函数范围之外定义了$folder,并且函数正在修改它。关闭 PowerShell 并重新启动它。另外,将您的 $folder += 更改为 $folder =
  • 谢谢!它在你和乔恩的帮助下工作

标签: powershell folderbrowserdialog


【解决方案1】:

你得到这个结果是因为这条线也产生了输出:

[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")

PowerShell 返回函数的所有输出,因此您的结果实际上是一个数组,其中包含加载程序集的输出和文件夹名称。

像这样在程序集加载操作之前添加 [void] 将省略额外的输出并为您提供您期望的结果:

[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")

或者正如 Anthony Stringer 在 cmets 中提到的那样,您可以使用 Add-Type 代替,它不会产生任何输出,并且可能是首选方法:

Add-Type -AssemblyName System.Windows.Forms

另外,TheMadTechnician 是正确的,您不需要 +=,只需要 $folder 变量的 =。

answer 更详细地解释了从 PowerShell 函数返回输出的行为。

【讨论】:

  • 因为这个(过时的):msdn.microsoft.com/en-us/library/… 我推荐这个:Add-Type -AssemblyName System.Windows.Forms
  • 好的,过时的不是我想要的。尝试了 Add-Type 并没有得到我需要的结果。 Add-Type -AssemblyName System.Windows.Forms $FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog [void]$FolderBrowser.ShowDialog() $FolderBrowser.SelectedPath Write-Host "FolderBrowser="$FolderBrowser
  • 看起来您在 $FolderBrowser.ShowDialog() 前面添加了 [void]。您不想这样做,因为您基本上只是将结果发送到 null。当你想丢弃它的输出时,你只需要使用 [void] 或管道到 Out-Null。
  • Jon 移除空白并没有帮助。在原始脚本中确实将 [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") 替换为 Add-Type -AssemblyName System.Windows.Forms 并且有效。谢谢摇滚明星!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多