#powershell
#powershell
Вопрос:
прежде всего, я полный новичок, когда дело доходит до PowerShell. Я как бы унаследовал проект от коллеги и хочу его улучшить.
В сценарии PowerShell я хочу выбрать несколько документов через систему.Windows.Формы.OpenFileDialog, который должен быть открыт позже. Основываясь на работе моего коллеги, я написал это.
Add-Type -AssemblyName System.Windows.Forms
$defaultFolder='Pfad'
Function Get-FileName($defaultFolder)
{
[System.Reflection.Assembly]::LoadWithPartialName(“System.windows.forms”) |
Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $defaultFolder
$OpenFileDialog.filter = “All files (*.*)| *.*”
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
} end function Get-FileName
$OpenFileDialogr.Description = "Bitte zu archivierenden Ordner wählen"
$OpenFileDialog.ShowNewFolderButton = $false
# Dialog anzeigen
$res = $OpenFileDialog.ShowDialog()
if($res -eq 'Cancel'){
return
}
Я получаю сообщение об ошибке, что описание свойства не найдено.
Может ли кто-нибудь помочь мне с этим?
BR
Комментарии:
1. У вас опечатка:
$OpenFileDialogr
(обратитеr
внимание на конец)
Ответ №1:
Как уже прокомментировал Матиас, у вас есть опечатка в вашем коде, но также вы используете фигурные «умные кавычки» ( “
и ”
), что может заставить код делать странные вещи..
Делая $OpenFileDialog.ShowDialog() | Out-Null
это, вы фактически отбрасываете возвращаемое значение (‘OK’ или ‘Cancel’). Приведенный ниже код использует это, чтобы убедиться, что мы ничего не возвращаем при отмене.
Я бы изменил функцию на
function Get-FileName {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $false)]
[string]$WindowTitle = 'Open File',
[Parameter(Mandatory = $false)]
[string]$InitialDirectory,
[Parameter(Mandatory = $false)]
[string]$Filter = "All files (*.*)|*.*",
[switch]$AllowMultiSelect
)
Add-Type -AssemblyName System.Windows.Forms
$openFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$openFileDialog.Title = $WindowTitle
$openFileDialog.Filter = $Filter
$openFileDialog.CheckFileExists = $true
if (![string]::IsNullOrWhiteSpace($InitialDirectory)) { $openFileDialog.InitialDirectory = $InitialDirectory }
if ($AllowMultiSelect) { $openFileDialog.MultiSelect = $true }
if ($openFileDialog.ShowDialog().ToString() -eq 'OK') {
if ($AllowMultiSelect) {
$selected = @($openFileDialog.Filenames)
}
else {
$selected = $openFileDialog.Filename
}
}
# clean-up
$openFileDialog.Dispose()
return $selected
}
а затем вызовите его как:
$defaultFolder='Pfad'
Get-FileName -WindowTitle "Bitte zu archivierenden Dateien wählen" -InitialDirectory $defaultFolder -AllowMultiSelect
Комментарии:
1. Спасибо за быстрый ответ. При запуске вашего кода я получаю сообщение об ошибке: отсутствует «}» в блоке инструкций. CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException FullyQualifiedErrorId: MissingEndCurlyBrace
2. @Peter Я думаю, что вы не скопировали весь код функций и забыли окончательное закрытие
}
. Пожалуйста, проверьте это. Для меня это работает так, как задумано3. @Питер Приятно слышать! Будучи новичком в платформе, вы можете этого не знать, но обычно принято принимать ответ, который решил вашу проблему, щелкнув значок галочки слева. Это помогает другим людям с аналогичным вопросом легче его найти.