作成 2010.01.05
更新 2011.11.27
PowerShell で SaveFileDialog もどき
なんか表示できなかったので。
本体
Function Show-SaveFileDialog([String] $default_filename = ""){
  [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
  $STR_OPEN_TITLE = "ファイルを保存する"
  $STR_OPEN_BUTTON = "保存"
  $STR_CANCEL_BUTTON = "キャンセル"
  $STR_OPEN_DIR = "保存する場所:"
  $STR_OPEN_NAME = "ファイル名:"
  $STR_FOLDER_UP = "↑"
  $STR_SAVE_QUESTION = "指定されたファイルは既にありますが、上書きしますか?"
  $SAVE_PATH = $null

  $file_dialog = New-Object Windows.Forms.Form
  $file_dialog.Width = 505
  $file_dialog.Height = 274
  $file_opendir_label = New-Object Windows.Forms.Label
  $file_opendir_combo = New-Object Windows.Forms.ComboBox
  $file_opendir_up = New-Object Windows.Forms.Button
  $file_open_list = New-Object Windows.Forms.ListBox
  $file_open_button = New-Object Windows.Forms.Button
  $file_cancel_button = New-Object Windows.Forms.Button
  $file_openname_label = New-Object Windows.Forms.Label
  $file_openname_text = New-Object Windows.Forms.TextBox

  $file_opendir_label.AutoSize = $true
  $file_opendir_label.Location = New-Object Drawing.Point(10,10)
  $file_opendir_label.Text = $STR_OPEN_DIR

  $file_open_button.Text = $STR_OPEN_BUTTON
  $file_open_button.Location = New-Object Drawing.Point(($file_dialog.Width - $file_open_button.Width - 15), ($file_dialog.Height - ($file_open_button.Height)*2 - 41))
  $file_open_button.Add_Click({
    if($file_openname_text.Text.Length -lt 1)
    {
      [String] $temp_item = $file_open_list.SelectedItem
      if($temp_item -match "\\$")
      {
        $temp_item1 = $file_opendir_combo.Text.Trim("\") + "\" + $temp_item.Trim("\")
        if($file_opendir_combo.Items.IndexOf($temp_item1) -lt 0)
        {
          $file_opendir_combo.Items.Insert($file_opendir_combo.Items.IndexOf($file_opendir_combo.Text) + 1 , $temp_item1)
        }
        $file_opendir_combo.Text = $temp_item1
        return $null
      }
      else
      {
        $file_openname_text.Text = $temp_item
      }
    }

    $file_path = $file_opendir_combo.Text.Trim("\") + "\" + $file_openname_text.Text
    if(Test-Path $file_path)
    {
      if([Windows.Forms.MessageBox]::Show($STR_SAVE_QUESTION,$STR_OPEN_TITLE,[Windows.Forms.MessageBoxButtons]::YesNo,[Windows.Forms.MessageBoxIcon]::Question) -eq [Windows.Forms.DialogResult]::No)
      {
        return $null
      }
    }
    $SAVE_PATH = $file_path
    $file_dialog.Close()
  })
  $file_cancel_button.Text = $STR_CANCEL_BUTTON
  $file_cancel_button.Location = New-Object Drawing.Point($file_open_button.left, ($file_open_button.top + $file_open_button.height + 6))

  $file_opendir_up.AutoSize = $false
  $file_opendir_up.Font = New-Object Drawing.Font($file_opendir_up.Font.FontFamily, 9)
  $file_opendir_up.Text = $STR_FOLDER_UP
  $file_opendir_up.Size = New-Object Drawing.Size(20, 20)
  $file_opendir_up.Location = New-Object Drawing.Point(($file_dialog.Width - $file_opendir_up.Width - 15), ($file_opendir_label.Top - 4))
  $file_opendir_up.Add_Click({
    $temp_dirname = $file_opendir_combo.Text
    if($temp_dirname -match "(.+)\\[^\\]+$")
    {
      $temp_dirname = $matches[1]
      if($temp_dirname.Length -lt 3){ $temp_dirname += "\" }
    }
    $file_opendir_combo.Text = $temp_dirname
  })

  $file_opendir_combo.Location = New-Object Drawing.Point(($file_opendir_label.Left + $file_opendir_label.PreferredWidth + 5),($file_opendir_label.Top - 4))
  $file_opendir_combo.Width = $file_opendir_up.Left - $file_opendir_combo.Left - 8
  $file_drives = Get-PSDrive -PSProvider "FileSystem"
  $file_combo_array = @()
  foreach($temp_item in $file_drives)
  {
    $file_combo_array += $temp_item.Root
    if($temp_item.CurrentLocation.Length -gt 0)
    {
      $temp_str = $temp_item.Root
      foreach($temp_item1 in $temp_item.CurrentLocation.Split("\"))
      {
        $file_combo_array += ($temp_str + $temp_item1)
        $temp_str += $temp_item1 + "\"
      }
    }
  }
  $file_opendir_combo.Items.AddRange($file_combo_array)
  $file_opendir_combo.Add_TextChanged({
    $file_open_list.Items.Clear()
    if(Test-Path $file_opendir_combo.Text)
    {
      $temp_array = Get-ChildItem -Path $file_opendir_combo.Text
      if($temp_array -ne $null)
      {
        $temp_array1 = @()
        foreach($temp_item in $temp_array)
        {
          if($temp_item.Mode -match "^d")
          {
            $temp_array1 += ($temp_item.Name + "\")
          }
          else
          {
            $temp_array1 += $temp_item.Name
          }
        }
        $file_open_list.Items.AddRange( $temp_array1 )
      }
    }
  })
  $file_opendir_combo.Text = (Get-Location).Path

  $file_open_list.Location = New-Object Drawing.Point($file_opendir_label.Left, ($file_opendir_label.Top + $file_opendir_combo.Height))
  $file_open_list.Width = $file_opendir_up.Width + $file_opendir_up.Left - $file_opendir_label.Left
  $file_open_list.Height = $file_open_button.Top - $file_open_list.Top
  $file_open_list.Add_SelectedValueChanged({
    [String] $temp_item = $file_open_list.SelectedItem
    if(!($temp_item -match "\\$"))
    {
      $file_openname_text.Text = $temp_item
    }
  })
  $file_open_list.Add_DoubleClick({
    [String] $temp_item = $file_open_list.SelectedItem
    if($temp_item -match "\\$")
    {
      $temp_item1 = $file_opendir_combo.Text.Trim("\") + "\" + $temp_item.Trim("\")
      if($file_opendir_combo.Items.IndexOf($temp_item1) -lt 0)
      {
        $file_opendir_combo.Items.Insert($file_opendir_combo.Items.IndexOf($file_opendir_combo.Text) + 1 , $temp_item1)
      }
      $file_opendir_combo.Text = $temp_item1
    }
    else
    {
      $file_openname_text.Text = $temp_item
      $file_dialog.Close()
    }
  })

  $file_openname_label.AutoSize = $true
  $file_openname_label.Location = New-Object Drawing.Point($file_opendir_label.Left, ($file_open_button.Top + 4))
  $file_openname_label.Text = $STR_OPEN_NAME
  $file_openname_text.Location = New-Object Drawing.Point(($file_opendir_label.Left + $file_opendir_label.PreferredWidth + 5), $file_open_button.Top)
  $file_openname_text.Width = $file_open_button.Left - $file_openname_text.Left - 10
  $file_openname_text.Text = $default_filename

  $file_dialog.Text = $STR_OPEN_TITLE
  $file_dialog.HelpButton = $false
  $file_dialog.FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedDialog
  $file_dialog.MaximizeBox = $false
  $file_dialog.MinimizeBox = $false
  $file_dialog.AcceptButton = $file_open_button
  $file_dialog.CancelButton = $file_cancel_button
  $file_dialog.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen

  $file_dialog.Controls.Add($file_opendir_label)
  $file_dialog.Controls.Add($file_opendir_combo)
  $file_dialog.Controls.Add($file_opendir_up)
  $file_dialog.Controls.Add($file_open_list)
  $file_dialog.Controls.Add($file_openname_label)
  $file_dialog.Controls.Add($file_openname_text)
  $file_dialog.Controls.Add($file_open_button)
  $file_dialog.Controls.Add($file_cancel_button)

  $null = $file_dialog.ShowDialog()
  return $SAVE_PATH
}
実行方法
$file_name = Show-SaveFileDialog "savefile.txt"
タグ: PowerShell

©2004-2017 UPKEN IPv4