2024年12月1日日曜日

PowerShellでは、Windows formsを使ってGUI画面が作れますが、使い終わったら、メモリーから消去させないと残ったままになるよ ー mainForm.Dispose(PowerShell)

         
VBAに拡張性がないかもと思って、最近は、PowerShellにはまっております。
この間の投稿では、VBAのユーザーフォームみたく呼び出せないかとトライだ。

先ず、ネットで色々ググってみて、呼び出せると分かって来てサンプルを作成。
このコードを紹介しましたが、ならばフォームを複数開いたりする場合のお話。

コードの記述では、フォームを開いて”OK”ボタンを押すと、フォームは消える。
それは画面上のことで、メモリーには残されると言うのが、分かって来ました。

つまり、最初のフォームでOKして、次もくり返している内に、挙動が怪しい。
先ず圧縮したいファイルを入力して、圧縮ファイル名を入力すると言う流れね。

これは、簡単にzipファイルを作ると言うコードを勉強がてらに作った分けだ。
おかしいなと思って調べると、メモリーに残ったフォームは消去が必要でした。

このコマンドはちゃんと存在して、VBAの”Unload”コマンドみたいな感じだ。
それで、作ったサンプルコードでは、終わり際でメモリーから解放しています。

それと、変数にも、その役割を終わらせるコードがあるので、追加しておいた。
というわけで、PowerShellは一挙手一投足に記述を書くので、結構面倒です。

一応、圧縮はできている感じですが、ファイルサイズが4MB近いと圧縮できなったりするので、実用には程遠い感じもしたりして、PowerShell制覇は、かなり長い道のりなのだと実感する自分なのでした。

<参考コード>
※次は、Compress-Archive.batで保存し、ps1ファイルと同じホルダに格納。
PowerShell -ExecutionPolicy RemoteSigned  -WindowStyle Hidden  .\Compress-Archive.ps1

このバッチファイルを最初に実行させてください。

※次は、Compress-Archive.ps1で保存
# ユーザーフォーム呼び出し入力(ZIPファイルのフルパス入力)
Add-Type -AssemblyName System.Windows.Forms  # アセンブリ読み込み
  Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form  # フォーム作成
  $form.Text = "圧縮したいファイル"
    $form.Size = New-Object System.Drawing.Size(280,200) 
      $form.StartPosition = "Manual"
        $form.Location = "100,100"
$OKButton = New-Object System.Windows.Forms.Button  #OKボタン設定
  $OKButton.Location = New-Object System.Drawing.Point(40,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,30)
      $OKButton.Text = "OK"
        $OKButton.DialogResult = "OK"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$CancelButton = New-Object System.Windows.Forms.Button  #キャンセルボタン
  $CancelButton.Location = New-Object System.Drawing.Point(130,120)
    $CancelButton.Size = New-Object System.Drawing.Size(75,30)
      $CancelButton.Text = "Cancel"
        $CancelButton.DialogResult = "Cancel"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$label = New-Object System.Windows.Forms.Label  # ラベルの設定
  $label.Location = New-Object System.Drawing.Point(10,30) 
    $label.Size = New-Object System.Drawing.Size(250,20) 
      $label.Text = "フルパスでファイル名(拡張子付)で入力してください"
$textBox = New-Object System.Windows.Forms.TextBox  #入力ボックス設定
  $textBox.Location = New-Object System.Drawing.Point(10,70) 
    $textBox.Size = New-Object System.Drawing.Size(245,50) 
$form.AcceptButton = $OKButton  # キー・ボタン関係
  $form.CancelButton = $CancelButton
$form.Controls.Add($OKButton)  # ボタン等をフォーム追加
  $form.Controls.Add($CancelButton)
    $form.Controls.Add($label) 
      $form.Controls.Add($textBox)
# フォームを表示させ、その結果を受け取る
$result = $form.ShowDialog()
# 結果による処理分岐
if ($result -eq "OK") {
  $x = $textBox.Text
$x
} # 変数に値が渡される
#別フォーム(zipファイル名付け)呼び出し
Add-Type -AssemblyName System.Windows.Forms  # アセンブリ読み込み
  Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form  # フォーム作成
  $form.Text = "圧縮後のファイル名"
    $form.Size = New-Object System.Drawing.Size(300,200) 
      $form.StartPosition = "Manual"
        $form.Location = "100,100"
$OKButton = New-Object System.Windows.Forms.Button  #OKボタン設定
  $OKButton.Location = New-Object System.Drawing.Point(40,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,30)
      $OKButton.Text = "OK"
        $OKButton.DialogResult = "OK"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$CancelButton = New-Object System.Windows.Forms.Button  #キャンセルボタン
  $CancelButton.Location = New-Object System.Drawing.Point(130,120)
    $CancelButton.Size = New-Object System.Drawing.Size(75,30)
      $CancelButton.Text = "Cancel"
        $CancelButton.DialogResult = "Cancel"
# 列挙子名:None, OK, Cancel, Abort, Retry, Ignore, Yes, No
$label = New-Object System.Windows.Forms.Label  # ラベルの設定
  $label.Location = New-Object System.Drawing.Point(10,30) 
    $label.Size = New-Object System.Drawing.Size(280,20) 
      $label.Text = "フルパスでファイル名(zip拡張子付)で入力してください"
$textBox = New-Object System.Windows.Forms.TextBox  #入力ボックス設定
  $textBox.Location = New-Object System.Drawing.Point(10,70) 
    $textBox.Size = New-Object System.Drawing.Size(245,50) 
$form.AcceptButton = $OKButton  # キー・ボタン関係
  $form.CancelButton = $CancelButton
$form.Controls.Add($OKButton)  # ボタン等をフォーム追加
  $form.Controls.Add($CancelButton)
    $form.Controls.Add($label) 
      $form.Controls.Add($textBox)
# フォームを表示させ、その結果を受け取る
$result = $form.ShowDialog()
# 結果による処理分岐
if ($result -eq "OK") {
  $x1 = $textBox.Text
$x1
} # 変数に値が渡される
$mainForm.Dispose() # スクリプトの実行が終了したらフォームを解放
Compress-Archive -Path $x -DestinationPath $x1  #ファイル圧縮保存
Remove-Variable x
Remove-Variable x1  # 変数の解除



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿