不在PowerShell脚本结果中显示“取消”

问题描述 投票:1回答:2

我有以下PowerShell脚本,它显示文件对话框以选择txt文件。如果用户取消对话框,则提供多行文本框

function GetDetails() {
  Add-Type -AssemblyName System.Windows.Forms;
  $browser = New-Object System.Windows.Forms.OpenFileDialog;
  $browser.Filter = "txt (*.txt)|*.txt";
  $browser.InitialDirectory = "E:\";
  $browser.Title = "select txt file";
  $browserResult = $browser.ShowDialog();

  if($browserResult -eq [System.Windows.Forms.DialogResult]::OK) {
    $nfoFile = $browser.FileName;

    if([string]::IsNullOrWhiteSpace($txtFile)) {
      return GetFromForm;
    }

    $txtFile = [System.IO.Path]::ChangeExtension($nfoFile, ".dac");
    $txtFile = $temp + [System.IO.Path]::GetFileName($txtFile);
    $exeArgs = "-f -S `"$txtFile`" -O `"$txtFile`"";

    Start-Process $anExe -ArgumentList $exeArgs -Wait;
    $result = Get-Content $txtFile | Out-String;

    $browser.Dispose();
    return $result;
  } else {
    return GetFromForm;
  }
}


function GetFromForm(){
  Add-Type -AssemblyName System.Windows.Forms;
  $form = New-Object System.Windows.Forms.Form;
  $form.Width = 800;
  $form.Height = 600;

  $txtBox = New-Object System.Windows.Forms.TextBox;
  $txtBox.Multiline = $true;
  $txtBox.AcceptsReturn = $true;
  $txtBox.AcceptsTab = $true;
  $txtBox.Visible = $true;
  $txtBox.Name = "txtName";
  $txtBox.Width = 760;
  $txtBox.Height = 660;

  $form.Controls.Add($txtBox);
  $form.ShowDialog();
 
  $form.Dispose();

  return $txtBox.Text;
}

$desc = GetDetails;
cls;
Write-Host $desc;

我有两个问题:

  1. Write-Host $desc中,如果用户选择取消对话框,则打印也取消herewithwhateverstrimg字符串。怎么避免呢?
  2. 如果我在ISE中运行脚本,生成的表单(在第二个函数中)将始终在ISE后面,即使我调用ShowDialog(),我希望表现为模态对话框。这是正常的还是有解决方法?
powershell
2个回答
0
投票

好的,我为效率做了一些改变,为功能做了一些改变。阅读脚本中的注释以获得解释。

# Just add types once. There is no need to add the types in each function.
Add-Type -AssemblyName System.Windows.Forms;
Add-Type -AssemblyName System.Drawing

function GetDetails() {


      $browser = New-Object System.Windows.Forms.OpenFileDialog;
      $browser.Filter = "txt (*.txt)|*.txt";
      $browser.InitialDirectory = "E:\";
      $browser.Title = "select txt file";

      $browserResult = $browser.ShowDialog();

      # Combined the if statements
      if($browserResult -eq [System.Windows.Forms.DialogResult]::OK -and [string]::IsNullOrWhiteSpace($txtFile) -ne $true) {

        $nfoFile = $browser.FileName;

        $txtFile = [System.IO.Path]::ChangeExtension($nfoFile, ".dac");
        $txtFile = $temp + [System.IO.Path]::GetFileName($txtFile);
        $exeArgs = "-f -S `"$txtFile`" -O `"$txtFile`"";

        Start-Process $anExe -ArgumentList $exeArgs -Wait;

        # The Raw flag should return a string
        $result = Get-Content $txtFile -Raw;

        $browser.Dispose();

        return $result;
      }

      # No need for else since the if statement returns
      return GetFromForm;

}

function GetFromForm(){


    $form = New-Object System.Windows.Forms.Form;
    $form.Text = 'Adding Arguments'
    $form.Size = New-Object System.Drawing.Size(816,600)
    $form.StartPosition = 'CenterScreen'

    # Added a button
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Point(585,523)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = 'OK'
    $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $OKButton
    $form.Controls.Add($OKButton)

    $txtBox = New-Object System.Windows.Forms.TextBox;
    $txtBox.Multiline = $true;
    $txtBox.AcceptsReturn = $true;
    $txtBox.AcceptsTab = $true;
    $txtBox.Visible = $true;
    $txtBox.Name = "txtName";
    $txtBox.Size = New-Object System.Drawing.Size(660,500)

    $form.Controls.Add($txtBox);  

    # Needed to force it to show on top
    $form.TopMost = $true

    # Select the textbox and activate the form to make it show with focus
    $form.Add_Shown({$txtBox.Select(), $form.Activate()})

    # Finally show the form and assign the ShowDialog method to a variable (this keeps it from printing out Cancel)
    $result = $form.ShowDialog();

    # If the user hit the OK button return the text in the textbox
    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        return $txtBox.Text
    }
}

$desc = GetDetails;
cls;
Write-Host $desc;

你可以在这里看到参考资料:https://docs.microsoft.com/en-us/powershell/scripting/samples/creating-a-custom-input-box?view=powershell-6


0
投票

你需要在$form.ShowDialog()中抑制GetFromForm的输出:

$form.ShowDialog()|out-null

Powershell将向函数/命令行开关中输出到主机的所有内容添加返回值。

关于你的第二个问题 - 请参阅此answer

请不要在行尾使用分号。这不是C#,会让你误以为这条线已经在这里结束,但它并不完全正确。

© www.soinside.com 2019 - 2024. All rights reserved.