ラベル PowerShell の投稿を表示しています。 すべての投稿を表示
ラベル PowerShell の投稿を表示しています。 すべての投稿を表示

2025年5月10日土曜日

ウインドウズのタスクバーの右端に日付・時刻・曜日は表示できますが、立ち上がりでそれを画面中央に表示させたい ー DatetimePicker(PowerShell)

      
自宅で複数台のパソコンを使ってますが、OSはもちろんウインドウズ11です。
各々は、ウインドウズ10からアップグレードしましたが、その時期は違うな。

冒頭のスタートアップ画面は、一台だけに表示されますが、自分には便利です。
なぜなら、退職してから毎日が休日みたいなもので、曜日がわからなくなるの。

まあ、この一台では、パソコンを起動すると月日と曜日が表示されて便利だ。
実は、認知症に罹った父親を引き取って面倒を長く見ていた頃がありました。

当時、父親のために新聞をとってあげたのも、症状の進行を遅らせたいから。
毎日、新聞の記事とか番組欄に目を通していれば、曜日に関心を持つだろう。

それで日付や曜日が分からなくなるのが記憶障害なのですが、これは避けたい。
実際、症状が進行すると見当障害が起きてしまって時間の概念がなくなるんだ。

時々、今日は何曜日だったかなと聞くのですが、ほとんど答えられなくなった。
次第に、症状が進行していくのが明らかになって、途中で聞くのを諦めました。

まあ、その時の記憶が鮮明に残っていまして、問題はリタイアした自分のこと。
曜日がわからなく日が来るのを、父親とダブらせてきて、予防をしないとなあ。

その一歩という分けで、パソコンの立ち上がり画面に曜日を表示させてみよう。
実は、冒頭の画面のような設定がわかりませんが、ならば、自作してみようか。

     
それで、パワーシェルで肝の”DatetimePicker”で、コードを書いてみました。
というわけで、それを挙げておきますので参考に使ってもらえるとありがたい。

後は、Windowsの起動時にアプリを自動的に実行させるために、スタートアップの登録が必要なのですが、それはググって探してもらうとして、惜しむらくは、表示された日付の後ろに曜日を加えることができなかった点で、悔いが残るのでした。

★"Untitled1.ps1" 
# ユーザーフォームを作る - DatetimePicker編 -
# アセンブリのロード
 Add-Type -AssemblyName System.Windows.Forms
# フォーム全体の作成
 $form = New-Object System.Windows.Forms.Form
 $form.Size = "300,100"
 $form.StartPosition = "CenterScreen"
 $form.MaximizeBox = $false
 $form.MinimizeBox = $false
 $form.Text = "DateTimePicker"
# DatetimePickerコントロールの作成
 $DatePicker = New-Object System.Windows.Forms.DatetimePicker
 $DatePicker.location = "30,20"
 $DatePicker.Format = [Windows.Forms.DateTimePickerFormat]::Custom
 $DatePicker.CustomFormat = "yyyy/MM/dd"  
 $DatePicker.Format = "Long"
# フォームにコントロールを追加
 $form.Controls.Add($DatePicker)
# フォームを表示
 $form.ShowDialog()

★"Untitled3.bat" バッチ処理から実行。
powershell PowerShell -ExecutionPolicy RemoteSigned  -WindowStyle Hidden  .\Untitled1.ps1

注:二つのファイルを同じフォルダーに置いて、実行してください。



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



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  # 変数の解除



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



2024年11月29日金曜日

新しくパソコンを買えば、環境構築をしなくてもすぐに利用できる開発環境が用意されている分けさ ー Windows PowerShell(VBAマクロ)

        
ウインドウズに実装されている"Power Shell"は、少しなじみの薄い存在です。
これと違って、コマンドプロンプトの入力画面なら、使った人もいるでしょう。

違いは何かと言えば、後から追加されて機能が強化されたのが”Power Shell”。
より高度な操作が可能であり、.NET Frameworkを利用することができます。

まあ、Webアプリケーションの開発で基本的な枠組みや機能をまとめたものね。
なので、プロンプトより強力なスクリプトを作成することができて便利なのだ。

システム管理や自動化などに利用されることが多いので、覚えると便利かもな。
それで、このパワーシェルは圧縮ファイルを作るコマンドが実装されています。

ならば、VBAで圧縮ファイルを作ってしまえと試しにコードを書いてみました。
ブックを起動したら最小化して、”InputBox”に圧縮するファイルを入力します。

なので、あたかもアプリが動いている感じですが、ファイル名は固定しました。
もし、圧縮するファイル名を指定するのなら、”InputBox”を追加してください。

なぜ、セルからフルパスのファイル名を引っ張らないのかは、?マークの存在。
つまり、文字列をセルへ入力すれば、先頭にシングルコーテーションが付くな。

これを取っ払うのがややこしくて、テキストをまま取得する手法を使いました。
それで、ADODBへ参照設定を行わないと、このブックは動いてくれないんだ。

参照設定ダイアログから、”Microsoft ActiveX Data Objects Library”を選ぶ。
というわけで、バージョンは、”6.1”の最新にしておけば問題なく動作するよ。

それから、解凍する場合も”powershell expand-archive”と似たようなコマンドなので、次回、チャレンジしようと思う自分なのでした。

☆サンプルコード
’ThisWorkbookの記述
Private Sub Workbook_Open() 'ブックを最小化して自動実行
  Application.Visible = False
    Call ArchiveOutput_ANSI   '処理を記述
      Call RunBatShell
        Application.Visible = True
            Application.Quit '圧縮ファイル保存が終わればブックを閉じる        
End Sub

'Module1の記述
Sub ArchiveOutput_ANSI() 'ANSIでファイル出力・ANSIとShift-Jisは同じ
Dim i As Integer, str As String, ado As Object  'ADODB.Stream生成
  Set ado = CreateObject("ADODB.Stream")
    ado.Charset = "Shift-Jis" '扱う文字コードの設定(ANSI)
      ado.Open 'ADODB.Stream開く
   ado.WriteText "@echo off", adWriteLine 'adWriteLineは改行で挿入
     ado.WriteText BatScriptMaking(), adWriteLine '内容保管
str = ""
  str = str & Environ("homedrive")
    str = str & Environ("homepath")
      str = str & "\Downloads\archive.bat"
    ado.SaveToFile str, 2 'ADODB.Streamの保管内容を保存
  ado.Close 'ADODB.Streamを閉じる
End Sub

Function BatScriptMaking() As String '関数プロシージャ
Dim str As String, str2 As String, str3 As String
str = ""
  str = str & Environ("homedrive")
    str = str & Environ("homepath")
      str = str & "\HOGEHOGE.bak" 'ダミーのファイル名を参考に表示 
str2 = ""
  str2 = str2 & Environ("homedrive")
    str2 = str2 & Environ("homepath")
      str2 = str2 & "\Documents\Compressed.zip"
str3 = ""
  str3 = str3 & "powershell compress-archive -Path "
    str3 = str3 & InputBox("フルパスでファイル名", "ファイル名", str)
      str3 = str3 & " -Force -DestinationPath "
        str3 = str3 & str2
          str3 = str3 & ""
  BatScriptMaking = str3
End Function

Sub RunBatShell() '保存したバッチファイルをShell関数で起動
Dim dProcessId  As Double, str As String
  str = ""
    str = str & Environ("homedrive")
      str = str & Environ("homepath")
        str = str & "\Downloads\archive.bat"
    dProcessId = Shell(str)
End Sub



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



2024年11月27日水曜日

コマンドプロンプトをDOS時代から使ってきましたが、より高度な操作が可能人あったのだと実感 ー PowerShellのフォーム(ウインドウズ)

       
冒頭の入力フォームは、Windowsに実装されたPowerShellで作ってみました。
どうも、ウインドウズには、この手のフォームのオカズが仕組んであるみたい。

エクセルのVBAを起動して、ユーザーフォームで作ったのとそっくりさんです。
というより、VBAがウインドウズのフォームを引っ張って来ているのでしょう。

今までは、エクセルのマクロに専念して、仕事でプログラムを組んできました。
ただ、開発されて既に三十年の言語ですから、64ビット化からも距離があるな。

マイクロソフトもOfficeにVBAを残すと言ってはいても、古めかしい感じです。
そう思うと、他に代用できるアプリがないかと、たどり着いたのがこの言語ね。

まあ、ウインドウズでアプリケーションソフトウェアを作るのが目的の言語だ。
簡易的なプログラミング言語と謳ってはおりますが、VBAよりは格段に難しい。

それでも、Linuxの記述とか面白半分で触っていたので、何とか勉強中なんだ。
要するに、Linux用のエイリアス(別名)のコマンドが搭載されていたりする。

加えて、斜め読みしていたC#言語の記述なんかと、雰囲気がよく似ています。
そこで、ネットから寸借したフォームのコードを、参考がてら紹介してみます。

入力ボックスに入力された値を、パワーシェルの画面に出力するだけのコード。
それでも、変数の設定になっていて、変数渡しの拡張性に期待しつつ奮闘中だ。

とうわけで、パワーシェルを起動させて、このコードを貼り付けてみて下さい。
次にエンターキーで実行すると、ちゃんと入力フォームもされるのが分かるな。

その一方で、VBAのユーザーフォームと違って、フォームの表示位置を細かく指定することができたりして、なかなか痒い所に手が届く記述なのだと、感心してしまう自分がいるのでした。

※サンプルコード
# ユーザーフォーム作成(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
}



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