Powershell - OpenFileDialog.FileName и FileBrowserDialog.SelectedFolder возвращают объект вместо строки - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь создать сценарий Powershell для преобразования некоторых аудиофайлов в папку, и я использую FolderBrowserDialog, чтобы запросить у пользователя местоположение выходной папки, и OpenFileDialog, чтобы получить путь к программе конвертера (в дело не в той же папке скрипта). Оба диалога вызываются с помощью отдельных функций, которые вызываются основной программой.

Проблема в том, что когда я возвращаю 'OpenFileDialog.FileName' и 'FolderBrowserDialog.SelectedPath' из каждой функции, я получаю объект, который содержит путь и некоторые другие значения, а не сам путь в виде строки.

Это объекты, которые я получаю из функций: OpenFileDialog.FileName Result FolderBrowserdialog.SelectedPath Result

Функции:

Function GetConverterPath
{ 
    $currentDirectory = Split-Path -Parent $PSCommandPath; 
    $isConverterInCurrentDirectory = Test-Path $($currentDirectory + "\tfa2wav.exe")  

    if($isConverterInCurrentDirectory)
    {
        return ($currentDirectory + "\tfa2wav.exe");
    } 


    [System.Windows.MessageBox]::Show("The converter's *.exe file was not found in the same directory as this script`n" + 
                                      "Please, point to the right file in the next dialog...", 'Converter not found...','Ok','Information');

    [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');

    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog;
    $OpenFileDialog.filter = 'Executable files (*.exe)|*.exe';
    $result = $OpenFileDialog.ShowDialog()

    if($result -eq 'OK')
    {
        return $OpenFileDialog.FileName;  
    }
    else
    {
        exit;
    }    
}

Function AskForOutputFolder
{    
    [System.Windows.MessageBox]::Show("In the next dialog you should select the folder where the converted sound files will be placed",                                     
                                      'Information','Ok','Information');

    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null;

    $folderBrowserDialog = New-Object System.Windows.Forms.FolderBrowserDialog;
    $folderBrowserDialog.Description = "Select a folder";
    $result = $folderBrowserDialog.ShowDialog()

    if($result -eq 'OK')
    {
        return $folderBrowserDialog.SelectedPath;
    }
    else
    {
        exit;
    }
}

Любые идеи о том, как решить эту проблему?

Кроме того, как я могу предотвратить появление сообщений «ОК» в консоли после каждого диалога?

1 Ответ

0 голосов
/ 04 мая 2020

С Get-Help 'about_return':

В PowerShell результаты каждого оператора возвращаются как выходные данные , даже без оператора, содержащего Return ключевое слово.

Используйте, например, [System.Void] struct следующим образом

[void][System.Windows.MessageBox]::Show(…);

[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');

В качестве альтернативы:

$null = [System.Windows.MessageBox]::Show(…);

Другая альтернатива (самая медленная, поэтому избегайте ее использования в петли):

[System.Windows.MessageBox]::Show(…) | Out-Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...