●パワーシェル(PSH)でプログラムを使えるようになると
◎はじめに この記事の[List2.2]アプリだけでプログラム作成、パワーシェル作成ができます。入門編としてプログラムを勉強したいと思われる方はぜひコピペして使って頂くと幸いします。
パソコンを50倍以上快適に利用するには、自分に合ったツールを準備する必要があります。プログラムに不得手な方もPSHに是非チャレンジしてみてはと思います。
◎他方、初心者向けの私の意見です。
ソフトウエアとは?プログラムとは?から話すと、前者の説明は難しいですが、後者はソフトウエアを具現化する一つの手段です。そして、その関連「データとデータの流れ」を明文化できれば、そのプログラムは具現化できると言えます。その明文化に色々なプログラム言語が利用されて、PSHもその1つです。
●「データ種別」と「データの流れ構造」を意識した学習
「プログラムを作成する」ということは、データとデータの流れ(処理/文/式)を考えながらプログラムを1行ずつ作成するということです。
よって次の(1)項でデータについて、(2)項で処理について体験してみてください。(3)項以降はデータと処理の複合利用です。少し難しいですがチャレンジしてみてください。
(1)[データ種別]として
次の1.1~1.6 をコピペ[List2.2]に登録しました。動作を体験してみてください。
1.1 変数(局所/広域)、1.2 文字列、1.3 計算、1.4 数字、1.5 16進数、1.6 配列、
(2)[データの流れ構造]として
次の2.1~2.9を登録しました。色々編集してみてください。
2.1 プログラム制御文、2.2 条件文字、2.3~2.9(for/if/else/foreach/while/case文)
(3)両者の複合応用済み処理(モジュール)として
次の利用例を登録しました。
3.1 関数利用、3.2 ファイル操作、3.3 ソート、3.4 データ入力
(4)最後に
チャレンジ応用例としてカレンダ生成プログラムを記載しました。
●「データとデータの流れ」のプログラム実現に向けて展開すると
「データ種別」を大別すると次の3種類です。また「データの流れ構造」も3種類です。 ①タイミングデータ(時刻/要因) ②ステイタスデータ(状態) ③アプリデータ(応用)
④無限ループ構造 ⑤条件ループ構造 ⑥ループ無し構造
プログラムとはこの6つの要素を複雑利用して実現していると言えます。
今回の「GUI窓PSH処理アプリ」を事例にすると以下です。
- マウスダブルクリック(21行目)や、右釦押下(16行目)が[①データ]で[⑥構造]です。
- 22~28行目の文字状態[②データ]で、対応する処理を実行します。
なおこのアプリプログラム全体は[⑤構造]で構成されています。といった具合です。
●コピペ[List2.2.5] [wndPshKiso151.bat]
@echo off &rem if not "%~0"=="%~dp0.\%~nx0" (start /min cmd /c,"%~dp0.\%~nx0" %* &exit) &rem ★DOS窓mini化
powershell -ExecutionPolicy RemoteSigned "$fln=(echo %0); $aa=(Cat $fln -Raw); $fdt=$aa.substring($aa.indexof('##'+'STT:')); Iex($fdt+'##>');"
exit; pause&exit;
##
##Ver1.08 wndPshKiso151.bat 2025/0105 by ryu #####################################
##
##STT: ★batファイルで[PSH基本窓]を起動([反映]釦、マクロ処理)
##
using namespace System.Windows.Forms; Add-Type -AssemblyName System.Windows.Forms,System.Drawing; ##★GUI
function dbg($cc){ [MessageBox]::Show($cc) }; function dbc($zcc){ Write-Host $zcc; }; ##★DBG
function ssView($bb){ $tBox.Text=$bb.substring( $bb.indexof("`n<#"+"#V" )); $tBox.SelectionStart=0; $mMain.Text="[1.08]"+$fln; }; ##★表示
##★メイン窓/編集窓の生成 ##★窓寸法(WW,HH) ##★文字種類/寸法 ##★背景色
$mMain=New-Object Form -Pro @{Size="1280,740";}; $szFont="BIZ UDゴシック"; $tBox=New-Object TextBox -Pro @{ Font="$szFont,13"; BackColor="#fff2e4";
Dock="Fill"; Multiline=$True; AcceptsReturn=$True; ScrollBars=[ScrollBars]::Vertical; }; $mMain.Controls.Add($tBox);
$mMain.MainMenuStrip =$dListMenu =New-Object MenuStrip -Pro @{ Font="$szFont,12"; }; $mMain.Controls.Add($dListMenu);
function ssDMnMenu($zcc){ $zmm=New-Object ToolStripMenuItem; $zmm.Text=$zcc; $dListMenu.Items.AddRange($zmm); $global:szMnBas=$zmm; return $zmm;}
function ssDMnMSet($zcc){ $zmm=New-Object ToolStripMenuItem; $zmm.Text=$zcc; $szMnBas.DropDownItems.AddRange($zmm); return $zmm;}
(ssDMnMenu "[反映]").add_Click({ dbg ("[反映保存]`n`n$fln");
$zcc=Cat $fln -Raw; SC ($fln+".bak") $zcc -Force; SC $fln ($zcc.substring(0,$zcc.indexof("`n<#"+"#V"))+$tBox.Text) -Force; });
(ssDMnMenu "[bak]").add_Click({ notepad ($fln+".bak") }); (ssDMnMenu "[再表示]").add_Click({ ssView( Cat $fln -Raw ) });
(ssDMnMenu "[編集]").add_Click({ notepad.exe $fln });
(ssDMnMenu "[Help]").add_Click({ Start "https://ryupapa008.blogspot.com/2024/08/guipsh_24.html#_List2.2.5" })
##★マウス[WC]操作 ##★DOS処理 ##★explorer処理 ⇒ ★psh追加⇒★画面設定⇒MainDLG表示 ##★Tool窓起動
$tBox.Add_DoubleClick({ $ln=((($tBox.Text).substring(0,$tBox.SelectionStart)).split("`n")).count-1; $zcc=($tBox.Lines[$ln]-split"##")[0];
if( $zcc.startsWith("> ") ){ $zcc=$zcc.substring(1); if($zcc.contains(" cd ") ){ Iex($zcc) }; Start Cmd -Arg "/k $zcc"; return; };
if( $zcc.startsWith(">> ")){ $zcc=$zcc.substring(2); Start -NoN Cmd -Arg "/c $zcc"; return; };
if( $zcc.startsWith("&") ){ for( $ii=1; $ii -lt 200; $ii++ ){ $cc=$tBox.Lines[$ln+$ii]; if($cc -eq $null){ break; };
if( $cc.startsWith(";") ){ $zcc+="`n"+($cc.substring(1)).trim(); }else{ if( $cc.startsWith("#") ){ continue;}; break; }; }; }; ##dbc $zcc;
if( $zcc.startsWith("&&& ")){ $zcc=$zcc.substring(3); $tBox.SelectionStart+=4; Iex($zcc); return;};
if( $zcc.startsWith("& ") ){ $zcc=$zcc.substring(1); $zcc=$zcc.replace('"','\"'); Start powershell -Arg "-noe $zcc"; return; };
if( $zcc.startsWith("&& ") ){ $zcc=$zcc.substring(2); $zcc=$zcc.replace('"','\"'); Start -NoN powershell -Arg "$zcc"; return; };
if( $zcc.startsWith("&") ){ ssMacAct $ln $zcc; };
}); function global:ssMacAct($ln,$zcc){}; $fladd=$fln.replace(".bat","_add.ps1"); if( Test-Path $fladd ){ . $fladd; };
ssView($fdt); $mMain.ShowDialog(); ##★最終行Gui窓表示
<##Ver1.10--[初心者向けPSH勉強支援]----------------------------------------------------------
##
##●パワーシェル(PSH)の基礎(その1:文法)....##[WC]をダブルクリック
## [&]行:起動 [&&]行:窓無し起動 [&&&]行:継続起動 [;]行:連結起動
##★1.1 変数(文字前に[$]を付加)
## 局所変数($dd1)、広域変数($global:dd2)、dd1は関数内部のみ有効、dd2は全体で有効。
##
## 次の[&&&]2行を順にダブルクリックし動作確認。
##
## $dd1は空(最初の&&&行のみ有効)、$dd2は数値表示(両方で有効)、[`n]は[改行]コード。
&&& $dd1=12345; $global:dd2=56789; dbg "設定`n dd1=$dd1 `n dd2=$dd2"; ##[WC]
&&& dbg "局所変数`n dd1=$dd1"; dbg "広域変数`n dd2=$dd2"; ##[WC]
##★1.2 文字列の代入と連結
## $zcc1と$zcc2へ文字代入し、$zcc3に+で連結。["]で括る方法もOK。
&&& $zcc1="ABCD"; $zcc2="abcd"; $zcc3=$zcc1+$zcc2; dbg "文字列連結`n $zcc3"; ##[WC]
&&& $zcc1="ABCD"; $zcc2="abcd"; $zcc3="$zcc1$zcc2"; dbg "文字列連結`n $zcc3"; ##[WC]
##★1.3 算術計算(四則演算)
## 普通に計算式を並べるだけでOK。
&&& $zdd=10000+2000+(50-47)*10+(30-21)/9; dbg $zdd; ##[WC]
##★1.4 小数点の計算&DLG表示(ダイアログ窓表示)...PSHが自動設定。整数にしたいとき[int]指定する。
&&& $zdd=10/3; dbg $zdd; ##[WC]
&&& $zdd=[int](10/3); dbg $zdd; ##[WC]
##★1.5 16進数の利用&DLG表示(10進表示)...PSHが自動設定のため普通に設定でOK。
&&& $zdd=0x0B; dbg $zdd; ##[WC]
##★1.6 配列の利用($zcm[] $zdm[])&全体DLG表示、個別表示
## 色々な設定方法があるが下記@()が判りやすい。
&&& $zcm =@("aaa0","bbb1","ccc2","ddd3"); dbg $zcm; dbg $zcm[0]; dbg $zcm[2]; dbg $zcm[3]; ##[WC]
&&& $zdm =@(10,11,12,13,14,15); dbg $zdm; dbg $zdm[1]; dbg $zdm[3]; dbg ($zdm[0]+$zdm[5]); ##[WC]
##★2.1 プログラム制御文(下記10個を基本使う)
## (if/ else/ for/ foreach/ do/ while/ switch/ continue/ break/ function)
##★2.2 プログラム条件文字(PSHは記号でなく右の文字を使う)
##
## ( > >= == <= < != && || ) --> ( -gt -ge -eq -le -lt -ne -and -or )
& ##★2.3 for文の利用例(ループ文) ##[WC]
;
; for( $ii=0; $ii -lt 20; $ii++ ){
; echo "ii=$ii"; ## 20回echoを処理
; };
& ##★2.4 if/else文の例 ##[WC]
;
; for( $ii=0; $ii -lt 10; $ii++ ){
; if( $ii -eq 3 ){ echo "Three"; }else{ echo $ii; };
; };
& ##★2.5 foreach文の例(ループ文) ##[WC]
;
; foreach( $cc in "!c11","!c22","!c33","!c44","!c55","!c66" ){
; echo $cc; ## $cc に順番に代入してechoを処理
; };
& ##★2.6 while文の例(ループ文) ##[WC]
;
; $ii=3; while( $ii -lt 13){
; echo "Loop = $ii"; $ii++; ## while()条件のときループ実行
; };
& ##★2.7 do-while文の例(ループ文) ##[WC]
;
; $ii=5; do{
; echo "ループ = $ii"; $ii++; ## echo行処理後、while()条件でループ
; }while( $ii -le 15);
& ##★2.8 switch文の例1( continue利用) ##[WC]
;
; for( $ii=0; $ii -lt 10; $ii++ ){
; switch( $ii ){
; 3 { echo "$ii`:Three"; continue; }
; 4 { echo "$ii`:Four"; continue; }
; 6 { echo "$ii`:Six"; continue; }
; default{ echo $ii; }
; };
; };
& ##★2.9 switch文の例2([$_]利用/ break利用) ##[WC]
;
; for( $ii=0; $ii -lt 19; $ii++ ){
; switch( $ii ){
; {$_ -in 3,7,13 }{ echo "$_`:あたり"; }
; {$_ -in 4,6,16 }{ echo "$_`:はすれ"; }
; default{ echo "$_"; }
; };
; if( $ii -eq 15 ){ echo "終わり(break)"; break; }
; };
& ##★3.1 関数登録と関数利用 ##[WC]
; ## 注.関数利用時は、変数と変数間に[()]と[,]が無い部分に注意のこと。
;
; echo "<<関数の登録&利用>>"
;
; function ssFncAct($zcc,$zdd0,$zdd1){
; echo ( "計算$zcc は "+($zdd0 * $zdd1) );
; };
;
; $zdd=5; ( ssFncAct "[$zdd]の3倍" $zdd 3 );
; $zdd=8; ( ssFncAct "[$zdd]の4倍" $zdd 4 );
##★3.2 ファイル
##★①ファイルの読取り(&&& PSH継続処理 ①後に②のこと)
## 読取はCatで可能。次の&&&行へ渡すため広域変数$global:szccを利用。
&&& $global:szfln="winCmd101.bat"; $global:szcc=(Cat $szfln); dbg $szcc; ##[WC]
##★②ファイルの書込み(.txt付加)⇒読取り⇒内容表示
## 書込はSCで可能。
&&& $zcc=($szcc+"<<<Fileの最後行に追加>>>"); ##[WC]
; $zfln="$szfln.txt"; (SC $zfln $zcc); dbg (Cat $zfln);
##★3.3 配列(ソート/逆ソート)色んな使い方があり、別途紹介予定。
& $zcc =@("cc:1", "bb:3", "cc:2", "ab:5", "aa:8"); ##[WC]順列ソート
; $zcc=$zcc|Sort; $zcc;
& $zcc =@("cc:1", "bb:3", "cc:2", "ab:4", "aa:8"); ##[WC]逆列ソート
; $zcc=$zcc|Sort -D; $zcc;
##★3.4 データ入力
##★キーデータ入力の例(Read-Host)
& $dd=Read-Host "Data="; "Data x 2 ="+([int]$dd)*2; ##[WC]
##★算術関数利用の例( [Math]::XXXX() を使う )
## sin/cos/tan/pi など色々あり。
& $dd=Read-Host "√(数値)=" ; [Math]::Sqrt([int]$dd); ##[WC]平方根(ルート)
&&& ##★4.1 処理例:カレンダを作成表示(起動のDOS窓へ(dbc)) ##[WC]
; ## チョットしたPSH利用のサンプルです。dbc利用も参考にしてください。
;
; $mm=(get-date).month;
; $zcc=(" "*14)+$mm+"月`n"; $zcc+=" 日 月 火 水 木 金 土`n";
; $dss=(Get-Date -Month $mm -Day 1); $ww=$dss.DayOfWeek.value__;
; $zcc+=(" "*28).substring(0,$ww*4 );
; for( $ii=1; $ii -le (($dss.AddMonths(1).AddDays(-1)).day); $ii++ ){
; if( $ii -lt 10 ){ $zcc+=" "+$ii; }else{ $zcc+=" "+$ii; };
; $ww++; if($ww -eq 7 ){ $ww=0; $zcc+="`n"; };
; }; dbc $zcc;
&&& ##★4.2 処理例:スーパWeb検索処理([&KKn]マクロ登録) ##★[WC]①
;
; $global:szMacroList="【[&KKn]マクロ一覧V1.0】
;#--&マクロ,-Web名称,------検索Url,---------------------------------------#
; &KKK, MSN検索, https://www.bing.com/search?q=
; &KKG, Google検索, https://www.google.co.jp/search?q=
; &KKY, Yahoo検索, https://search.yahoo.co.jp/search?p=
; &KKA, Amazon, https://www.amazon.co.jp/s?k=
; &KKR, R楽天市場, https://search.rakuten.co.jp/search/mall/
; &KK3, 一括検索(3), KKK/KKA/KKR
; &KK5, 一括検索(5), KKK/KKG/KKY/KKA/KKR
; &KKD, 株ドラ, https://www.kabudragon.com/s?t=
; &KKN, Now株価, https://finance.yahoo.co.jp/search/?query=
;";
; ##★[&KKn]マクロ処理
; function global:ssMacAct($ln,$zcc){ if( $zcc.startsWith("&KK") ){;}else{ return;};
; $zcmd=$zcc.substring(0,4); $zcc1=$zcc.substring(4).trim(); $zcm=$szMacroList.split(",`n");
; for($ii=0; $ii -lt $zcm.length; $ii++ ){ if( ($zcm[$ii].trim()) -ne $zcmd){ continue; }; break; };
; $zcc=(($zcm[$ii+2]).trim());
; if($zcc.startsWith("http")){ $zcc+=$zcc1; Iex( "Start `'$zcc`'" ); Start-Sleep -m 500; return; };
; (ssMacAdd $zcmd $zcc1);
; };
; ##★追加処理
; function global:ssMacAdd($zcmd,$zcc1){
; if( ($zcmd -eq "&KK3") -or ($zcmd -eq "&KK5") ){
; foreach($cc in $zcc.split("/")){ if($cc.length -eq 3){ ssMacAct $ln "&$cc $zcc1"; }; }; };
; };
;
; dbg "[登録完了]"
##★上記★[WC]①をダブルクリック[WC]後、下記を[WC]する。
&KKK こぴぺ gui ##[WC] MSNで検索
&KK5 ファンヒータ
&KKD 4755 6702 3402 6965 7270 ##[WC] 楽天 富士通 東レ 浜松 スバル
&KKN 4755 6702 3402 6965 7270 ##[WC] 楽天 富士通 東レ 浜松 スバル
&&& dbg $szMacroList
&KK5 コーヒー ブリックス