我找到了这个Powershell功能代码块来选择一个文件夹。然后,我添加了两个变量(sourcePath,source)来引用XAML文件。当用户按下“确定”时,我需要将选定的文件夹路径显示在不同的列表框“$ sourcePath”中。我尝试在“Return $ objForm.SelectedPath”之后将列表框调用为“$ sourcePath.Write($ objForm.SelectedPath)”。我做错了什么,但不知道如何解决它。谢谢。
$XAML = @'
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Choose Folder" Height="350" Width="500">
<StackPanel>
<Button x:Name="choose" Content="choose" HorizontalAlignment="Left"
Margin="42,108,0,0" VerticalAlignment="Top" Width="121" />
<ListBox x:Name="sourcePath" HorizontalAlignment="left" Height="45"
Margin="42,120,0,0" VerticalAlignment="Top" Width="400"/>
</StackPanel>
</Window>
'@
$sourcePath=$win.Find("sourcePath")
$source=$win.Find("source")
$source.Add_click({Select-FolderDialog})
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
Out-Null
Function Select-FolderDialog
{param([string]$Description="Select Folder",[string]$RootFolder="Desktop")
$objForm = New-Object System.Windows.Forms.FolderBrowserDialog
$objForm.Rootfolder = $RootFolder
$objForm.Description = $Description
$Show = $objForm.ShowDialog()
If ($Show -eq "OK")
{
Return $objForm.SelectedPath
$sourcePath.Write($objForm.SelectedPath)
}
Else
{
Write-Error "Operation cancelled by user."
}
$b = Select-FolderDialog
}
答案 0 :(得分:0)
删除"noImplicitAny": true
。它将值返回到控制台并结束该函数,这意味着永远不会执行Return $objForm.SelectedPath
。
Return关键字退出函数,脚本或脚本块
来源:about_Return
答案 1 :(得分:0)
只有一些小错误,例如使用“write”将某些东西放入ListBox。
当然,就像Frode F.指出的那样,省略了返回 - 除了在函数结束之前离开函数之外,函数内部不需要返回语句。
这是一个稍微修改过的脚本代码版本,它显示一个带有列表框和按钮的窗口,并将选定的路径放入该列表框中。
$XAML = @'
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Folder-Browser"
Height="500"
Width="600"
>
<StackPanel>
<ListBox x:Name="sourcePath" Height="300" Width="320" Margin="10"/>
<Button x:Name="choose" Content="Choose Folder" Width="120" Height="40" Margin="10"/>
</StackPanel>
</Window>
'@
$Win = [Windows.Markup.XamlReader]::Parse($XAML)
$sourcePath = $Win.FindName("sourcePath")
$button = $Win.FindName("choose")
$button.Add_Click({Select-FolderDialog})
Add-Type -Assembly System.Windows.forms
function Select-FolderDialog
{
param([String]$Description="Select Folder",
[String]$RootFolder="Desktop")
$objForm = New-Object System.Windows.Forms.FolderBrowserDialog
$objForm.Rootfolder = $RootFolder
$objForm.Description = $Description
$Show = $objForm.ShowDialog()
if ($Show -eq "OK")
{
$SourcePath.Items.Add($objForm.SelectedPath)
}
}
$Win.ShowDialog()
如果脚本使用PowerShell 4.0及更高版本运行,我建议使用parse方法立即返回Window对象:
$Win = [Windows.Markup.XamlReader]::Parse($Xaml)