パワーシェル(PSH)でプログラムを使えるようになると
1.はじめに
この記事の「コピペリスト」だけでプログラム作成ができます。入門編としてプログラムを勉強したいと思われる方はぜひ使って頂くと幸いします。パソコンを50倍以上快適に利用するには自分に合ったツールを準備する必要があります。プログラムに不得手な方もPSHに是非チャレンジしてみてはと思います。※スーパWeb検索:事前登録してスパっとWeb検索表示ができる便利なアプリ
2.初級者向けの私の意見です
ソフトウエアとは?プログラムとは?から話すとすると、前者の説明は難しいですが、後者はソフトウエアを具現化する一つの手段といえます。そしてその関連 [データとデータの流れ] を明文化できれば、そのプログラムは具現化できるともいえます。その明文化に色々なプログラム言語が利用されてPSH言語もその1つです。ここで大切な点は言語に関係なく [データとデータの流れ] の考え方は同じということです。よってPSH言語を勉強することは他の言語にも応用できるとなります。3.利用方法8.利用説明8.1.PSH窓の利用方法8.3.PSHの変数8.4.プログラム制御文8.5.条件判断文字と利用例8.6.関数の利用8.7.ファイル、ソート、データ入力など
3.利用方法→T
windowsメモ帳を使って下記の[コピペList2.2.5]をテキストファイルに張付けて [ファイル]>[名前を付けて保存] を押下し、ファイル名欄に [wndPshKiso151.bat] を入力し文字コードを[ANSI]設定して[保存]します。
このファイルをダブルクリックすると上記画面(相当内容)が表示されます。
このファイルをダブルクリックすると上記画面(相当内容)が表示されます。
4.[データ種別] と [データの流れの構造] を意識した学習→T
「プログラムを作成する」ということは、データとデータの流れ(処理/文/式)を考えながらプログラムを1行ずつ作成するということです。次の1.項でデータについて、2.項で処理について体験してみてください。3.項以降はデータと処理の複合利用です。少し難しいですがチャレンジしてみてください。- [データ種別]として次の1.1~1.6 を[コピペList2.2.5]に登録しました。
1.1 変数(局所/広域)、1.2 文字列、1.3 計算、1.4 数字、1.5 16進数、1.6 配列、
- [データの流れの構造]として次の2.1~2.9を登録しました。
2.1 プログラム制御文、2.2 条件文字、2.3~2.9(for/if/else/foreach/while/case文)
- 両者の応用済み処理(モジュール)として次の利用例を登録しました。
3.1 関数利用、3.2 ファイル操作、3.3 ソート、3.4 データ入力
- 最後に
チャレンジ応用例としてカレンダ生成プログラムを記載しました。
PSH学習はこの [PSH窓処理アプリ] だけでできるので結構便利です。
ここで [データ種別] を大別すると次の3種類です。また [データの流れの構造] も3種類です。
- ①タイミングデータ(時刻/要因など)
- ②ステイタスデータ(状態など)
- ③アプリデータ(応用など)
- ④無限ループ構造
- ⑤条件ループ構造
- ⑥ループ無し構造
今回の [PSH窓処理アプリ] を事例にすると以下です。
- マウスダブルクリック(32行目)やメニュ釦押下(20行目~)が [①データ] で [⑥構造] の処理です。
- 33~38行目の文字状態が [②データ]で対応する処理を実行します。
- このアプリプログラム全体は [⑤構造] で構成されています。
5.便利な[スーパWeb検索]アプリを作る→T
この[PSH勉強支援]アプリにはWeb検索処理の短文を登録しています。この部分を使い次の手順でスーパWeb検索アプリを作成します。PSH窓アプリ作成の参考になると幸いします。- [A:アプリ処理]の登録:##★アプリ処理 の箇所に記載します。
- [B:最終行Gui窓表示]の登録:次の行をプログラムの最後に記載します。
ssView($fdt); $mMain.ShowDialog(); - [C:起動時表示内容]の登録:次の行以降に記載します。
<##VerN.NN--[XXXXXXXXX]------
6.コピペList2.2.5 [wndPshKiso151.bat] →T
◎ファイル作成手順は[1.1導入編]の利用方法や補足説明を参照ください。@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.20 wndPshKiso151.bat 2025/1205 by ryu #####################################
##
##STT: ★bat:PSH勉強支援アプリ(PSH基礎その1)
##
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 MsgYesNo($cc0,$cc1){ return [MessageBox]::Show($cc1,$cc0,"YesNo"); };
function ssView($bb){ $tBox.Text=$bb.substring( $bb.indexof("<#"+"#Ver" )); $tBox.SelectionStart=0; $mMain.Text="[1.20] "+$fln; }; ##★表示
##★メイン窓/編集窓の生成 ##★窓寸法(WW,HH) ##★文字種類/寸法 ##★背景色
$mMain=New-Object Form -Pro @{Size="1080,740";}; $szFont="BIZ UDゴシック"; $tBox=New-Object TextBox -Pro @{ Font="$szFont,13"; BackColor="#E4FFE5";
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;}
function ssSavPrg($typ,$cc){if((MsgYesNo "確認" "保存`n`n$fln")-ne "Yes"){dbg "中止";return}; SC "$fln.$typ" (Cat $fln) -For; SC $fln $cc -For};
(ssDMnMenu "[反映]").add_Click({ $zcc=Cat $fln -Raw; $zcc0=($zcc.substring(0,($zcc.indexof("<#"+"#Ver")-1))+$tBox.Text); ssSavPrg "bak" $zcc0 });
(ssDMnMenu "[bak]").add_Click({ notepad ($fln+".bak") }); (ssDMnMenu "[再表示]").add_Click({ ssView( Cat $fln -Raw ) });
(ssDMnMenu "[Clear]").add_Click({ $zcc=""; (0..3)|%{ $zcc+=$tBox.Lines[$_]+"`r`n"; }; $tBox.Text=$zcc; $tBox.SelectionStart=0;});
(ssDMnMenu "[編集]").add_Click({ notepad.exe $fln }); $global:szWeb="https://ryupapa008.blogspot.com/2024/08/guipsh_24.html#_szIdm";
(ssDMnMenu "[一覧]").add_Click({$zcc=""; foreach($cc in $tBox.Text.split("`n")){ if($cc.contains("##★")){$zcc+="$cc`n";}; }; MsgBox $zcc; });
$aa=(ssDMnMenu "[Help]"); (ssDMnMSet "はじめに(Web)").add_Click({ $cc="10"; Start "$szWeb$cc" });
@("60.コピペList","30.利用方法","81.PSH窓の利用","83.変数","84.制御文","85.条件文字","86.関数","87.ファイルなど",
"88.カレンダ表示","50.Web検索作成","89.Web検索説明" )|%{ (ssDMnMSet $_).add_Click({ $cc=($this.Text).substring(0,2); Start "$szWeb$cc" }); };
$aa=(ssDMnMSet "----"); (ssDMnMSet "[Clip>アプリ入替]").add_Click({ $zcc0=((GCB)-join "`r`n").trim()+"`r`n"; $zfl0=Split-Path $fln -Lea;
if( $zcc0.startsWith("@echo off") -and $zcc0.contains($fln0) ){}else{ dbg "$zfl0 をマウスコピーください"; return}; ssSavPrg "old" $zcc0 });
(ssDMnMSet "old表示").add_Click({ notepad ($fln+".old") });
##★マウス[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("&") ){ for( $ii=1; $ii -lt 500; $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; };
##★MsgBox関数
function MsgBox($cc){ $fm=New-Object Form -Pro @{Size="920,540"}; $global:mBox=$mm=New-Object TextBox -Pro @{ Font="$szFont,12"; Multiline=$True;
Dock="Fill"; AcceptsReturn=$True}; $fm.Controls.Add($mm); $mm.Text=$cc.replace("`r","").replace("`n","`r`n"); $mm.SelectionStart=0; $fm.Show(); };
##
##★アプリ処理の登録箇所
##
ssView($fdt); $mMain.ShowDialog(); ##★最終行Gui窓表示
<##Ver1.11--[初級者向け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="TestTest.txt"; "TestTestTest" > $szfln; ##[WC]
; $global:szcc=(Cat $szfln -Raw); dbg $szcc;
##★②ファイルの書込み(.txt付加)⇒読取り⇒内容表示
## 書込はSCで可能。
&&& $zcc=($szcc+"<<<Fileの最後行に追加>>>"); ##[WC]
; $zfln="$szfln.txt"; (SC $zfln $zcc); dbg (Cat $zfln -Raw);
##★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.1B 処理例:カレンダを作成表示(起動の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; MsgBox $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/
; &KKT, 乗車時間, https://transit.yahoo.co.jp/search/result/
; &KKC, 地図検索, https://www.google.co.jp/maps/place/
; &KKN, noteサイト検索, https://note.com/search?q=
; &KK3, 一括検索(3), KKK/KKA/KKR
; &KK5, 一括検索(5), KKK/KKG/KKY/KKA/KKR
; &KKd, 株ドラ, https://www.kabudragon.com/s?t=
; &KKnn,Now株価, https://finance.yahoo.co.jp/search/?query=
;";
; ##★[&KKn]マクロ処理
; function global:ssMacAct($ln,$zcc){ if( $zcc.startsWith("&KK") ){;}else{ return;};
; $zcmd=($zcc.split(" "))[0]; $zcc1=$zcc.substring(5).trim(); $zcm=$szMacroList.replace("; "," ").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 こぴぺ パワー ##[WC] MSNで検索(よく使うサイト)
&KKN コピペ パワー ##[WC] noteサイトで検索
&KK5 ファンヒータ ##[WC] 一度に(5)つのサイト検索
&KK3 コーヒー ブリックス ##[WC] 一度に(3)つのサイト検索
&KKT 大阪-京都 ##[WC] 乗車時間(Time)検索
&KKC 京都 ##[WC] 地図の検索(Chi Zu)
&KKd 4755 6702 3402 6965 7270 ##[WC] 楽天 富士通 東レ 浜松 スバル
&KKnn 4755 6702 3402 6965 7270 ##[WC] 楽天 富士通 東レ 浜松 スバル
&&& dbg $szMacroList ##★[WC] [&KKn]マクロ一覧のdbg表示
&&& MsgBox $szMacroList ##★[WC] [&KKn]マクロ一覧のMsgBox表示
[wndPshKiso151.bat]
7.[スーパWeb検索]の作成[wPshSupWeb101.bat]→T
(1) 利用方法(3項)の手順で[コピペList2.2.5]から[ wPshSupWeb101.bat ]を作成します。このファイルを起動して[編集]を押下してファイルを開きます。(2) 次の3行をマウスコピーして[B:最終行Gui窓表示]と[C:起動時表示内容]の登録を行います。
ssView($fdt); $mMain.ShowDialog(); ##★最終行Gui窓表示
<##Ver1.10--[初級者向けPSH勉強支援]--------------
次の箇所にペースト(張付け)し、dbg行に[##]を記載します(コメント)。
##; dbg "[登録完了]"...[257行目]
##★上記★[WC]①をダブルクリック[WC]後、下記を[WC]する...[260行目]
ssView($fdt); $mMain.ShowDialog(); ##★最終行Gui窓表示
<##Ver1.10--[初級者向けPSH勉強支援]------------
&KKK こぴぺ gui ##[WC] MSNで検索
&KK5 ファンヒータ
::
(3)Web検索の[A:アプリ処理]登録するため不要な行を削除します。次の44~229行を削除すれば編集完了です。そして[反映]釦を押して保存します。
##★アプリ処理の登録箇所...[44行目]
ssView($fdt); $mMain.ShowDialog(); ##★最終行Gui窓表示
<##Ver1.10--[初心者向けPSH勉強支援]--------------
::
::
&&& ##★4.2 処理例:スーパWeb検索処理([&KKn]マクロ登録) ...[229行目]
8.利用説明→T
このアプリのファイルを作成しダブルクリックしてPSH窓を表示します。
8.1.PSH窓の利用方法→T
上部メニュー釦の利用方法を次に記述します。
- [反映]釦:PSH窓の編集内容をこのアプリファイルに反映し保存します。
BackUpファイル(xxxx.bat.bak)に反映前を保存します。 - [bak]釦:上記の反映前のファイル内容を表示します。
- [再表示]釦:アプリファイルの内容を再表示します。
- [Clear]釦:4行以降をクリアして表示します。(追加)
- [編集]釦:このアプリファイルをwindowsメモ帳で開きます。
- [一覧]釦:[##★]行の一覧を表示します。(追加)
- [help]釦:このWebサイトの各種説明のサブ項目をWeb表示します。
- [help]->[Clip>アプリ入替]釦:WebサイトのコピペListへの入替などで使います。
BackUpファイル(xxxx.bat.old)に入替前を保存します。
8.2.PSHのプログラム作成及び実行方法→T
(1) [&]、[&&] 又は [&&&] の次にPSH文(プログラム)を記述してダブルクリック[WC]することでそのPSH文が実行されます。次に例を示します。また[##]以降にコメントを記述します。
& Date; ##★[WC]
[表示]
2025年12月9日 18:41:23
(2)次に複数行のPSH文(プログラム)を記述する場合は[;]を記述してPSH文を記述します。
また1列に複数のPSH文を記述する場合も[;]を記述します。次に例を示します。
& Date; ##★[WC]
; $nn=1+10+100+1000 ; $mm=$nn*2;
; $nn
; $mm
[表示]
2025年12月9日 18:51:17
1111
2222
(3)[& PSH文] の記述では[窓表示]してPSH文を実行します。(以下例です)
& dir ##★[WC]
(4)[&& PSH文] の記述では[窓表示無し]でPSH文を実行します。(以下例です)
&& calc ##★[WC]
(5)[&&& PSH文] の記述では[窓表示無し]でこのPSH窓アプリの継続処理として実行します。(以下例です)
&&& dbg "ABCDEF" ##★[WC]
[補足] 関数dbgはこのアプリの中で関数でプログラミングされています。それを利用して
小窓を表示しその窓の中に"ABCDEF"を表示します。
(6)複数行指定の[;]は[&][&&][&&&]に有効です。(上記(2)項及び以下例です)
&&& Date; ##★[WC]
; $nn=1+10+100+1000 ; $mm=$nn*2;
; dbg $nn
; dbg $mm
[表示] [DLG小窓] に表示します。
8.3.PSHの変数(文字前に[$]を付加)→T
(1)はじめに
◎PSH学習の最初として変数を習います。最初は[数字変数]と[文字変数]、[局所変数]と[広域変数]、[配列変数]の5つです。この5つを理解するだけで十分プログラムが作成できるようになります。あとは必要に応じて学習すれば良いと思います。
(2)PSHでの変数
◎PSH言語は文字の前に[$]を付加すると変数になります。他の多くの言語は変数の定義文が必要ですがPSHの場合は[$]を付加するだけです。次に例を記述します。PSH窓にコピペして動作確認ください。
& $dd1=11; $dd2=12; $dd3=13; $dd4=14; ##★①[WC]数字変数へ数値の代入
; $dd1; $dd2; $dd3; $dd4; ##表示
& $cc1="ABCD"; $cc2="efgh"; $cc3="IJKL"; ##★②[WC]文字変数へ文字の代入
; $cc1; $cc2; $cc3; ##表示
(3)数字変数と計算処理
◎上記の例★①が[数字変数]です。数字を変数[$ddX]に代入して例えば計算処理などに利用します。四則演算[+][-][*][/]は普通に記述するだけで計算できます。また少数を整数にしたい場合は[int]を[$]の前に記述します★④。
& $dd1=11; $dd2=12; ##★③[WC]
; $dd1=($dd1*5 -3); ##計算1
; $dd2=($dd2+123); ##計算2
; $dd3=10000+2000+(50-47)*10+(35-21)/9; ##計算3
; $dd4=[int]$dd3; ##★④少数を[int]で整数に変換
; $dd1; $dd2; $dd3; $dd4; ##表示
52
135
12031.5555555556
12032
(4)文字変数と文字の連結
◎上記の例★②が[文字変数]です。文字を変数[$ccX]に代入して利用します。
なお文字変数には["]で文字をくくり代入します。または[']で文字をくくり代入します。
文字変数の連結では[+][*]が使えて便利です。
& $cc1="ABCD"; ##★④[WC]
; $cc2='efgh';
; $cc1;
; $cc2;
; ($cc1 + $cc2 + $cc2); ##★[+]で連結
; ($cc2 * 10); ##★[*]で10回連結
; ($cc2 * 4 + "-AA AA-" + $cc1); ##★複合での連結
ABCD
efgh
ABCDefghefgh
efghefghefghefghefghefghefghefghefghefgh
efghefghefghefgh-AA AA-ABCD
(5)局所変数と広域変数
・局所変数($dd1)とは:プログラムや関数など局部的な範囲内だけで有効な変数です。
・広域変数($dd2)とは:1つのアプリ範囲内の全体で共通利用できる変数です。
次に例を記述します。PSH窓にコピペして[WC]ください。
$dd1が局所変数で$dd2が広域変数です。なお広域変数へ代入するときは毎回[$global:]を記述します。
&&& $dd1=12345; ##★[WC] 局所変数に代入
; $global:dd2=56789; ##★ [$global:]を記述して広域変数に代入
; dbg "局所変数 dd1 = $dd1"; ##表示
; dbg "広域変数 dd2 = $dd2"; ##表示
[表示]
[DLG窓] 局所変数 dd1 = 12345
[DLG窓] 広域変数 dd2 = 56789
次のPSH文をPSH窓にコピペして[WC]ください。
$dd1の局所変数はブランクを表示し、$dd2の広域変数は設定値を表示します。
[&&&]処理は関数として処理するため、今回の[&&&]処理では局部変数はブランクになります。
&&& ##★[WC]
; dbg "局所変数 dd1 = $dd1"; ##ブランク表示
; dbg "広域変数 dd2 = $dd2"; ##設定値の表示
[表示]
[DLG窓] 局所変数 dd1 =
[DLG窓] 広域変数 dd2 = 56789
(6) 配列変数($zcm[] $zcmm[])
◎配列変数の種類として2つあります。
- 普通の配列変数:$zcm =@() の指定で配列登録します。
- 連想型配列変数:$zcmm =@{} の指定で連想型の配列登録します。
◎配列とは[]を使って変数グループとして処理したいときに使います。
例えば、$cc1 $cc2 $cc3 .... $cc100 を処理するとき全ての変数に3を代入したいとき100行プログラミングすることになります。
一方で配列変数を使うとPSH言語の場合次のように1文で記述可能です。
& $zcm=@(); (1..100)|%{ $zcm += 3 }; ##★①[WC]配列変数の宣言、生成、代入
; $zcm[14] ##14番目の表示
; $zcm[98] ##98番目の表示
[上記★①文の説明]
1) $zcm=@(); zcm名で配列登録
2) (1..100)|%{ xxxxx }; 1,2,3,4,,,,100と100回 xxxxxを処理
3) $zcm += 3 ; 配列数を += で追加しながら3を代入
◎配列変数の利用例を次に記述します。
&&& $zcm =@("aaa0","bbb1","ccc2","ddd3"); ##★[WC] 文字を配列に登録
; dbg $zcm; ##配列グループで利用
; dbg $zcm[0]; ##要素0 を表示
; dbg $zcm[2];
; dbg $zcm[3];
&&& $zdm =@(10,11,12,13,14,15); ##★[WC] 数字を配列に登録
; dbg $zdm[1]; ##要素1 を表示
; dbg $zdm[3];
; dbg ($zdm[0]+$zdm[5]); ##配列を使った計算
; foreach( $dd in $zdm ){ dbg $dd }; ##★②配列グループで利用
[上記★②文の説明]
・$dd に $zdmの要素を順番に代入して、dbg関数の処理を実行
◎連想型配列とは配列[xxx]のxxxに文字列を利用できる配列のことです。
例えば $zcmm["abcd"] という具合に利用します。結構便利な配列です。
少し高度ですが次に利用例を記述します。PSH窓にコピペして[WC]ください。
&&& $aa=(ssDMnMenu "Test"); $global:zcmm=@{}; ##★[WC] PSH窓に新メニュ登録
; @("aaa","bbb","ccc")|%{ $zcmm[ $_ ]="cmd $_";
; (ssDMnMSet $_ ).add_Click({ dbg $zcmm[ $this.Text ] }); }; ##サブメニュ登録
[表示]
[上記PSH文の説明]
1) ssDMnMenu関数でTestメニューをPSH窓に登録
2) $global:zcmm=@{}; で連想配列を登録
3) @( xxxx ) |%{ yyyy }; で配列xxxxの各要素を $_ に代入して yyyy の処理を実行
4) $zcmm[ $_ ] の連想配列の各要素にダミーコマンド"cmd zzz"を登録
5) (ssDMnMSet www).add_Click({ ccccc }); でサブメニュコマンドを登録
8.4.プログラム制御文(10個の基本文)→T
◎プログラミングにはプログラムの流れを変える次の制御文があります。
(if/ else/ for/ foreach/ do/ while/ switch/ continue/ break/ function)
◎[if文][else文]を使い「もしXXXXならYYYY処理をしてXXXX以外ならZZZZ処理をする」をプログラミングすると以下です。
if( XXXX ){ YYYY; }else{ ZZZZZ; };
◎[for文]を使い「 1から10まで+1ずつ順番にXXXX処理をする」は以下です。
for( $ii=1; $ii -le 10; $ii++ ){ XXXXX };
1から[$ii=1]、10まで[$ii -le 10]、+1ずつ順番に[$ii++] という意味です。
◎[foreach文]や[do文]や[while文]を使い上記は次のようにも記述できます(処理は同じ)。
最初は[for文]の利用を進めます。どれを使うかは慣れてくれば判るようになります。
foreach( $ii in (1..10) ){ XXXXX };
$ii=1; while( $ii -le 10 ){ XXXXX; $ii++; };
$ii=1; do{ XXXXX $ii++; }while($ii- lt 10); ## -le でなく -lt;
更に次のように記号だけでも記述できます。
(1..10)|%{ XXXX };
◎[switch文]を使い「 sssが AAのときXXX処理、BBのときYYY処理、CCのときZZZ処理をする」は以下です。
switch( $sss ){
"AA" { XXX }
"BB" { YYY }
"CC" { ZZZ }
};
◎処理の流れを変える[continue文][break文]の例です。次のXX行をPSH窓にコピペして[WC]ください。
&&& for( $ii=1; $ii -le 10; $ii++ ){ ##★[WC]
; switch( $ii ){
; 3{ dbg "$ii ★あたり★"; continue;}
; 6{ dbg "$ii ★あたり★"; continue;}
; };
; if( $ii -eq 8 ){ dbg "$ii 終わり(break)"; break;};
; dbg "$ii はすれ";
; };
8.5.条件判断文字と利用例→T
◎制御文における条件判断:他の言語では[>][>=][<][<=]などの記号を使いますが
PSH言語では[-lt][-le][-gt][-ge]と文字を使います。
・ > : -gt
・ >= : -ge
・ == : -eq
・ <= : -le
・ < : -lt
・ != : -ne
・ && : -and
・ || : -or
◎制御文を使ったサンプル文を次に記述します。
最初はPSH窓にコピペして★[WC]をダブルクリックして動作確認ください。また[-lt][-le][-eq]や数字を変更して確認してください。
また動作確認ができたら練習を兼ねてキー入力してプログラミング作成出来るようになると良いと思います。
& ##★2.3 for文の利用例(ループ文) ##★[WC]
; for( $ii=0; $ii -lt 20; $ii++ ){
; echo "ii=$ii"; ## 20回echoを処理
; };
[補足] echo文は 画面出力表示のコマンドです(PSHでは無くてもOK)。
& ##★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; }
; };
; };
[補足] detault文はswitch文における「それ以外は」のif文のelse文に相当します。
& ##★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; }
; };
[補足] {$_ -in 3,7,13} は [switch文] における[又は]に相当します。この文では [$ii] が[3]又は[7]又は[13]なら [echo "$_`:あたり"]文 の処理をします。
[補足] [echo "$_`:あたり"]文 の[`]は文字列登録の["]~["]でくくるとき[:]文字を表示したいとき[`:]と記述します。[`]の使い方はWebなどで検索して学習ください。
8.6.関数の利用→T
◎関数登録:局所関数と広域関数があります。
・function sFncAct($zcmd,$zpam){ XXXX }; 局所関数の登録
・function global:ssFncAct($zcmd,$zpam){ XXXX }; 広域関数の登録
2つの関数の違いは私も十分理解できてませんがアプリ処理を複数のファイルで動作させる場合で例えばファイルAで関数登録してファイルBでその関数を使うとか、PSH言語の関数のオーバライト機能を使う場合などは広域関数の登録が必要のようです。
◎関数のオーバライト機能:今回は説明を割愛しますが便利な機能です。
簡単にはAA関数でXXX処理をしてたがメニュ釦押下で機能変更をする場合、AA関数を再度登録して書換え(オーバライト)してYYY処理するなどの利用です。
◎関数利用の[引数]:関数処理をするための[入力データ]のことです。
他の言語は[引数の種類を宣言]する必要がある言語が多いですがPSH言語は殆どの場合、引数の種類宣言は不要のようで次のように簡単に登録できます。
次のXX行をPSH窓にコピペして[WC]すると動作確認ができます。
&&& function sFncAct($zcmd,$zpam){ dbg "cmd は $zcmd"; dbg "pam は $zpam" }; ##★[WC]
; sFncAct1 "CCC" 123;
◎[引数]の数と関数の[戻り値]:[戻り値]とは関数処理後の関数からの「出力データ」です。
次のXX行をPSH窓にコピペして[WC]することで動作確認をします。
他の言語では次の例の [##★②引数の数が正しい] 以外は利用エラーとなる場合が多いですが
PSH言語では [引数の数や種類の不一致] [関数の戻り値の有り無し] でも問題なく利用できるようです。
&&& function sFAct($zcmd,$zpm1,$zpm2,$zpm3){ ##★[WC]
; switch($zcmd){
; "AA"{ return "AAAA"}
; "BB"{ return "$zcmd $zpm1 $zpm3"}
; "CC"{ return "$zcmd $zpm1 $zpm3"}
; "DD"{ return}
; };
; };
; dbg ( sFAct "AA" ); ##★①引数の数不足でもOK
; dbg ( sFAct "BB" 1 2 3 ); ##★②引数の数が正しい
; dbg ( sFAct "CC" "A" 2 "B" ); ##★③引数の種類変更もOK
; dbg ( sFAct "DD" 1 2 3 ); ##★④[戻り値]無しの変更もOK
; dbg ( sFAct "EE" 1 2 3 ); ##★⑤[return]無しで戻るのもOK
◎関数利用時の注意点:登録関数を利用するとき他の言語では例えば上記 sFActの場合次のように記述します。
sFAct( zcmd, zpm1, zpm2, zpm3) ;
ところがPSH言語では次のように記述します( [(] [,] [)] の削除 )。
sFAct $zcmd $zpm1 $zpm2 $zpm3 ;
この記述方法は慣れるまでよく間違いますので注意ください。
8.7.ファイル、ソート、データ入力など→T
(1) ファイルの読取り
読取は [Cat] コマンド文を使います(参照: 短縮PSH)。
&&& $global:szfln="TestTest.txt"; "TestTestTest" > $szfln; ##★[WC]
; $global:szcc=(Cat $szfln -Raw); dbg $szcc;
(2) ファイルの書込み
書込は[SC]コマンド文を使います。
&&& $zcc=($szcc+"<<<Fileの最後行に追加>>>"); ##★[WC]
; $zfln="$szfln.txt"; (SC $zfln $zcc); dbg (Cat $zfln -Raw);
(3) 配列(ソート/逆ソート)
次に簡単なソートの利用例を記述します。色んな使い方があり必要によりWeb検索して学習ください。
& $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;
(4) データ入力
キーデータ入力の例を記述します(Read-Host文の利用)。
& $dd=Read-Host "Data="; ##★[WC]
; "Data x 2 ="+([int]$dd)*2;
(5) 算術関数利用
[Math]::XXXX() を使うと色々な算術関数の利用が可能です(sin/cos/tan/pi など)。
& $dd=Read-Host "√(数値)=" ; [Math]::Sqrt([int]$dd); ##★[WC]平方根
8.8.カレンダ表示処理
◎PSH利用のプログラミング例です。PSH窓にコピペして動作確認をします。
新たにMsgBox窓(関数)を追加してカレンダを表示しました。また1行毎にdbg関数を入れて動作が判るようにしました。
新たにMsgBox窓(関数)を追加してカレンダを表示しました。また1行毎にdbg関数を入れて動作が判るようにしました。
◎プログラム動作が確認できたら何も見ないでプログラミングできるようになるまで練習してみてください。なおエラーが発生したら黒窓にその内容が表示されますので修正します。
&&& ##カレンダ表示 ##★[WC]
; $mm =(get-date).month; dbg $mm; ##月を取得
; $zcc =(" "*14)+$mm+"月`n"; dbg $zcc; ##カレンダ中央に月を配置
; $zcc +=" 日 月 火 水 木 金 土`n"; dbg $zcc; ##曜日を設定
; $dss =(Get-Date -Month $mm -Day 1); dbg $dss; ##当月の1日目を取得
; $ww =$dss.DayOfWeek.value__ ; dbg $ww; ##1日目の曜日番号を取得(0~6)
; $zcc +=(" "*28).substring(0,$ww*4 ); dbg $zcc; ##その番号分の余白を付加
; ##当月の日を最後まで配置
; $dd=(($dss.AddMonths(1).AddDays(-1)).day); dbg $dd; ##当月の最後の日
; for( $ii=1; $ii -le $dd ; $ii++ ){
; if( $ii -lt 10 ){ $zcc+=" "+$ii; }else{ $zcc+=" "+$ii; }; ##1~9 と 10~31 で余白追加
; $ww++; if($ww -eq 7 ){ $ww=0; $zcc+="`n"; }; ##土曜[7]なら改行[`n]追加
; };
; MsgBox $zcc; ##MsgBox にカレンダを表示
; dbc $zcc; ##黒窓にカレンダを表示
8.9.Web検索処理
◎[&KKn]をWeb検索マクロ指定の記号とします(n=0~9,A~Z,a~z)。
次にWeb検索サイトの名称、検索Url を [MacroList] 変数に文字列として登録します。
次のフォーマットでWeb検索マクロを一括登録します。(PSH窓にコピペして[WC]で登録)
[ &KKA] , [ Amazon ] , [Webサイトの検索URL]
◎最初に9件の[&KKn]マクロを登録します。
&&& $global:szMacroList="【[&KKn]マクロ一覧V1.0】 ##★[WC]
;#--&マクロ,-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=
;";
◎次にこのマクロ処理の関数を登録します。(同様にコピペ[WC]登録)
&&& ##★[&KKn]マクロ処理
; function global:ssMacAct($ln,$zcc){ ##★[WC]
; if( $zcc.startsWith("&KK") ){;}else{ return;}; ##[&KK]をチェック
; $zcmd=($zcc.split(" "))[0]; $zcc1=$zcc.substring(5).trim(); ##最初文字と5文字以降に分割
; $zcm=$szMacroList.replace("; "," ").split(",`n"); ##マクロ登録Listを配列に展開
; for($ii=0; $ii -lt $zcm.length; $ii++ ){
; if( ($zcm[$ii].trim()) -ne $zcmd){ continue; }; break; }; ##[&KKn]登録位置を検索
; $zcc=(($zcm[$ii+2]).trim()); ##マクロ登録位置から2項目を取得
; if($zcc.startsWith("http")){ ##2項目がURL登録なら次のWeb表示処理を実行
; $zcc+=$zcc1; ##5文字以降の検索文言をURLに連結
; Iex( "Start `'$zcc`'" ); ##PSH文を実行しWeb表示
; Start-Sleep -m 500; return; }; ##0.5秒間スリープ待ちして関数を終了
; (ssMacAdd $zcmd $zcc1); ## 2項目目がURL登録以外のマクロ処理を実行
; };
◎次に2項目がURL登録以外のマクロ処理の関数を登録します。(同様にコピペ[WC]登録)
◎[&KK3]または[&KK5]なら[/]で分割して再度上記関数を再帰実行して一度に複数回のWeb検索表示をします。
&&& ##★追加処理(&KK3 と &KK5 の処理)
; 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 "完了"; ##Web検索処理の登録完了を表示
◎[&KKn]マクロ利用の例です。(PSH窓にコピペして1行づつ[WC]して動作確認)
