本ページには広告が含まれています。
POWERSHELL関数 (スクリプト関数)の処理が遅いのを改善したモジュールです。
- 構文
- PowerShell.Create( debug )
- String = PowerShell.Execute( cmd )
- PowerShell.Quit
- PowerShell.Create( debug )
- 引数
- cmd 必須
- 実行するPowerShellのコマンド
- debug 省略可
- デバッグを表示を場合はTrue、表示しない場合はFalse
- 戻り値
プログラム
//////////////////////////////////////////////////
// 【引数】
// 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のアイコン(
)が表示されます。
- Execute関数
- PowerShellを実行するための関数です。フォームの有無は自動で判断されるため、Create関数を実行せずExecute関数を実行することも可能です。事前にCreate関数でPowerShellのフォームが起動している場合は、すぐに処理を実行することができます。PowerShellのフォームが起動していない場合は、PowerShellのフォームを起動する処理があるため処理に時間がかかります。
- Quit関数
- Create関数で起動したPowerShellのフォームを終了します。Quit関数を省略した場合、別プロセスのプログラムでもフォームを使い回すことができます。
以下はPowerShellモジュールを使ったプログラムです。PowerShellのフォームを生成するCreate関数に時間はかかりますが、PowerShellのプログラムを実行するExecute関数は短時間で処理を進めることができます。POWERSHELL関数 (スクリプト関数)を2回以上実行する場合は、PowerShellモジュールを使ったほうが高速化できます。
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[])になる場合、各要素をダブルクォーテーションで囲みカンマ区切りで出力されます。
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"