Выбор нескольких документов в папке с помощью powershell

#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. @Питер Приятно слышать! Будучи новичком в платформе, вы можете этого не знать, но обычно принято принимать ответ, который решил вашу проблему, щелкнув значок галочки слева. Это помогает другим людям с аналогичным вопросом легче его найти.