PowerShellパワーシェルモジュール

本ページには広告が含まれています。

POWERSHELL関数 (スクリプト関数)の処理が遅いのを改善したモジュールです。

構文
  1. PowerShell.Create( debug )
  2. String = PowerShell.Execute( cmd )
  3. PowerShell.Quit
引数
cmd 必須
実行するPowerShellのコマンド
debug 省略可
デバッグを表示を場合はTrue、表示しない場合はFalse
戻り値

プログラム

UWSC
//////////////////////////////////////////////////
// 【引数】
//   cmd : 実行するPowerShellのコマンド 
//   debug : デバッグを表示を場合はTrue、表示しない場合はFalse 
// 【戻り値】
//   
//////////////////////////////////////////////////
MODULE PowerShell
	DIM title = "PowerShellフォーム"
	DIM class = "WindowsForms10.Window.8.app"
	PROCEDURE Create(debug = FALSE)
		DIM ID = GETID(title, class)
		IFB ID = -1 THEN
			DIM ProcessId = STATUS(GETID(GET_THISUWSC_WIN), ST_PROCESS)
			script = REPLACE(source, "%TITLE%", title)
			script = REPLACE(script, "%PROCESSID%", processId)
			IFB debug THEN
				script = REPLACE(script, "%DEBUG%", "$true")
			ELSE
				script = REPLACE(script, "%DEBUG%", "$false")			
			ENDIF
			POWERSHELL(script, TRUE, FALSE)
			ID = GETID(title,, 5)
		ENDIF
		ProcessId = STATUS(ID, ST_TITLE)
		IFB STATUS(ID, ST_ISID) THEN
			CTRLWIN(ID, SHOW)
		ELSE
			MSGBOX("PowerShellの実行に失敗しました。")
			EXIT
		ENDIF
	FEND
	FUNCTION Execute(cmd)
		Create()
		DIM ID = GETID(title, class)
		CTRLWIN(ID, SHOW)
		CLKITEM(ID, "リセット")
		SENDSTR(ID, cmd, 1, TRUE)
		CLKITEM(ID, "実行")
		DIM t = GETTIME()
		REPEAT
			RESULT = GETSTR(ID, 0, STR_ACC_STATIC)
		UNTIL RESULT <> "" OR GETTIME() - t >= 3
	FEND
	FUNCTION Quit()
		RESULT = CLKITEM(GETID(title, class), "終了")
	FEND
TEXTBLOCK source
add-type -assembly system.windows.forms
$title = "%TITLE%"
$processId = "%PROCESSID%"
$doNotShow = !%DEBUG%
$prompt = ""
$timer = new-object windows.forms.timer -property @{interval=60}
$form = new-object windows.forms.form -property @{text=$title}
$form.Width = 300
$form.Height = 300
$timer.add_tick({
	if(ps -id $processId){
	}else{
		ps -id $pid|kill
	}
})
$form.add_shown({$timer.start()})
$base = new-object windows.forms.flowlayoutpanel -property @{dock="fill";parent=$form}
$inBox = new-object windows.forms.textbox -property @{
	parent = $base;
	multiline = $true;
	text = $prompt;
	width = 280
}
 
$reset = new-object windows.forms.button -property @{
	parent = $base;
	text = "リセット"
}
$exec = new-object windows.forms.button -property @{
	parent = $base;
	text = "実行"
}
$quit=new-object windows.forms.button -property @{
	parent = $base;
	text = "終了";
	dialogresult = "OK"
}
$outLabel = new-object windows.forms.label -property @{
	parent = $base;
	text = $prompt;
	width = 280;
	height = 150
}
$reset.add_click({
	$outLabel.text=$prompt
	$inBox.text=$prompt
})
$exec.add_click({
	try{
		$res=Invoke-Expression $inBox.text
		$type=Invoke-Expression ("(" + $inBox.text + ").GetType()")
		$res = $type
		if(($type -eq [System.Object[]])-Or ($type -eq [hashtable])){
			$properties = Invoke-Expression ("(" + $inBox.text + " | Get-Member -MemberType Property | Select-Object -ExpandProperty Name) -join ','")
			$res = Invoke-Expression ("((" + $inBox.text + ") | Select-Object " + $properties + " | ConvertTo-Csv -NoTypeInformation) -join '`r`n'")
		}else{
			$res = Invoke-Expression $inBox.text
		}
	}catch{
		$res=$error[0]
	}
	$outLabel.text=$res
	$inBox.text=$prompt
})
if($doNotShow){
	$form.opacity=0.01
	$form.formborderstyle="none"
}
$form.showdialog()
ENDTEXTBLOCK
ENDMODULE

使い方

POWERSHELL関数 (スクリプト関数)は呼び出すたびにPowerShellを使う準備に時間がかかるため実用的ではありません。

PowerShellモジュールはPowerShellを実行するためのフォームを用意し、そのフォームを使い回すことで実行時間を短縮します。

PowerShellモジュールのそれぞれの関数の役割は次のとおりです。

Create関数
PowerShellのフォームを起動します。引数にTrueを指定するとフォームを表示し、Falseを指定するとフォームは表示しません。フォームが起動している間はタスクバーにPowerShellのアイコン(pngwing.com.png)が表示されます。
Execute関数
PowerShellを実行するための関数です。フォームの有無は自動で判断されるため、Create関数を実行せずExecute関数を実行することも可能です。事前にCreate関数でPowerShellのフォームが起動している場合は、すぐに処理を実行することができます。PowerShellのフォームが起動していない場合は、PowerShellのフォームを起動する処理があるため処理に時間がかかります。
Quit関数
Create関数で起動したPowerShellのフォームを終了します。Quit関数を省略した場合、別プロセスのプログラムでもフォームを使い回すことができます。

以下はPowerShellモジュールを使ったプログラムです。PowerShellのフォームを生成するCreate関数に時間はかかりますが、PowerShellのプログラムを実行するExecute関数は短時間で処理を進めることができます。POWERSHELL関数 (スクリプト関数)を2回以上実行する場合は、PowerShellモジュールを使ったほうが高速化できます。

UWSC
WITH PowerShell
	.Create
	PRINT .Execute("Get-Location")
	PRINT .Execute("[Management.ManagementDateTimeConverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem).LastBootUpTime)")
	.Quit
ENDWITH
結果
プレーンテキスト
C:\Users\akita\AppData\Local\Temp
05/30/2025 15:17:05

Get-ChildItem Env:のように戻り値がオブジェクト配列(System.Object[])になる場合、各要素をダブルクォーテーションで囲みカンマ区切りで出力されます。

UWSC
WITH PowerShell
	.Create
	PRINT PowerShell.Execute("Get-ChildItem Env:")
	.Quit
ENDWITH
結果
プレーンテキスト
"Key","Value"
"ALLUSERSPROFILE","C:\ProgramData"
"APPDATA","C:\Users\akita\AppData\Roaming"
"CommonProgramFiles","C:\Program Files (x86)\Common Files"
"CommonProgramFiles(x86)","C:\Program Files (x86)\Common Files"
"CommonProgramW6432","C:\Program Files\Common Files"
"COMPUTERNAME","WINDOWS"
"ComSpec","C:\WINDOWS\system32\cmd.exe"
"DriverData","C:\Windows\System32\Drivers\DriverData"
"FP_NO_HOST_CHECK","NO"
"FPS_BROWSER_APP_PROFILE_STRING","Internet Explorer"
"FPS_BROWSER_USER_PROFILE_STRING","Default"
"FREI0R_PATH","C:\PROGRA~2\APOWER~1\VIDEOC~1\frei0r;C:\Program Files (x86)\Apowersoft\Video Converter Studio\frei0r"
"HOMEDRIVE","C:"
"HOMEPATH","\Users\akita"
"JD2_HOME","C:\Users\akita\AppData\Local\JDownloader 2.0"
"LOCALAPPDATA","C:\Users\akita\AppData\Local"
"LOGONSERVER","\\WINDOWS"
"NUMBER_OF_PROCESSORS","4"
"OneDrive","C:\Users\akita\OneDrive"
"OS","Windows_NT"
"Path","C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;c:\Program Files (x86)\Common Files\Ulead Systems\MPEG;C:\Program Files (x86)\AOMEI Backupper;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Calibre2\;C:\Program Files\dotnet\;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;C:\Program Files (x86)\Java\jre6\bin;D:\Programs\;C:\Users\akita\AppData\Local\Programs\Python\Python313\Scripts\;C:\Users\akita\AppData\Local\Programs\Python\Python313\;C:\Ruby31\bin;C:\Users\akita\AppData\Local\Microsoft\WindowsApps;D:\Programs\;C:\Users\akita\AppData\Local\Android\Sdk\platform-tools;D:\Programs\ffmpeg-N-100898-gd16b0a4bf0-win64-gpl-shared\bin;D:\Programs\platform-tools_r30.0.5-windows\platform-tools;C:\Users\akita\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\akita\AppData\Local\Programs\EmEditor;C:\Users\akita\Program Files (x86);C:\Program Files\WindowsApps\;C:\Users\akita\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\manim\;C:\Users\akita\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\Scripts\;C:\Users\akita\AppData\Local\Muse Hub\lib"
"PATHEXT",".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL"
"PROCESSOR_ARCHITECTURE","x86"
"PROCESSOR_ARCHITEW6432","AMD64"
"PROCESSOR_IDENTIFIER","Intel64 Family 6 Model 42 Stepping 7, GenuineIntel"
"PROCESSOR_LEVEL","6"
"PROCESSOR_REVISION","2a07"
"ProgramData","C:\ProgramData"
"ProgramFiles","C:\Program Files (x86)"
"ProgramFiles(x86)","C:\Program Files (x86)"
"ProgramW6432","C:\Program Files"
"PSModulePath","D:\Documents\WindowsPowerShell\Modules;C:\Program Files (x86)\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\"
"PUBLIC","C:\Users\Public"
"SCITE_USERHOME","C:\Users\akita\AppData\Local\AutoIt v3\SciTE"
"SESSIONNAME","Console"
"SystemDrive","C:"
"SystemRoot","C:\WINDOWS"
"TEMP","C:\Users\akita\AppData\Local\Temp"
"TMP","C:\Users\akita\AppData\Local\Temp"
"UD_INSTALL_DIR","C:\Program Files\UltraDefrag"
"USERDOMAIN","WINDOWS"
"USERDOMAIN_ROAMINGPROFILE","WINDOWS"
"USERNAME","akita"
"USERPROFILE","C:\Users\akita"
"windir","C:\WINDOWS"
"windows_tracing_flags","3"
"windows_tracing_logfile","C:\BVTBin\Tests\installpackage\csilogfile.log"

参考文献

  1. powershellを起動しっぱなしにする | satocchiaブログ - 楽天ブログ